2013-01-01 39 views
15

Tôi có một df:Làm cách nào để thay đổi giá trị chỉ mục của khung dữ liệu Pandas?

>>> df 
        sales  cash 
STK_ID RPT_Date     
000568 20120930 80.093 57.488 
000596 20120930 32.585 26.177 
000799 20120930 14.784 8.157 

Và muốn thay đổi giá trị chỉ số đầu tiên liên tiếp từ ('000568','20120930') để ('000999','20121231'). Kết quả cuối cùng sẽ là:

>>> df 
        sales  cash 
STK_ID RPT_Date     
000999 20121231 80.093 57.488 
000596 20120930 32.585 26.177 
000799 20120930 14.784 8.157 

Làm cách nào để đạt được điều này?

Trả lời

19

Với thiết lập này:

import pandas as pd 
import io 

text = '''\ 
STK_ID RPT_Date sales cash 
000568 20120930 80.093 57.488 
000596 20120930 32.585 26.177 
000799 20120930 14.784 8.157 
''' 

df = pd.read_csv(io.BytesIO(text), delimiter = ' ', 
       converters = {0:str}) 
df.set_index(['STK_ID','RPT_Date'], inplace = True) 

Chỉ số, df.index có thể được bố trí vào một mới MultiIndex như thế này:

index = df.index 
names = index.names 
index = [('000999','20121231')] + df.index.tolist()[1:] 
df.index = pd.MultiIndex.from_tuples(index, names = names) 
print(df) 
#     sales cash 
# STK_ID RPT_Date     
# 000999 20121231 80.093 57.488 
# 000596 20120930 32.585 26.177 
# 000799 20120930 14.784 8.157 

Hoặc, chỉ số có thể được thực hiện vào các cột, các giá trị trong sau đó các cột có thể được gán lại và sau đó các cột được trả về chỉ mục:

df.reset_index(inplace = True) 
df.ix[0, ['STK_ID', 'RPT_Date']] = ('000999','20121231') 
df = df.set_index(['STK_ID','RPT_Date']) 
print(df) 

#     sales cash 
# STK_ID RPT_Date     
# 000999 20121231 80.093 57.488 
# 000596 20120930 32.585 26.177 
# 000799 20120930 14.784 8.157 

Điểm chuẩn với IPython %timeit gợi ý giao lại các chỉ số (phương pháp đầu tiên, ở trên) là đáng kể nhanh hơn so với đặt lại chỉ mục, thay đổi giá trị cột, và sau đó thiết lập các chỉ số một lần nữa (phương pháp thứ hai, trên):

In [2]: %timeit reassign_index(df) 
10000 loops, best of 3: 158 us per loop 

In [3]: %timeit reassign_columns(df) 
1000 loops, best of 3: 843 us per loop 
+0

Hoạt động! Cảm ơn ! – bigbug

Các vấn đề liên quan