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
Hoạt động! Cảm ơn ! – bigbug