[英]Pandas MultiIndex, selecting values by 1. and 2. level
通過選擇1.和2.級別的值來解決一些問題。
我通過設置
header = [0,1]
得到了一個MultiIndex
In[1]: df = pd.read_csv('Data.txt', sep='\t', header=[0,1], skipinitialspace=True)
In[2]: print(df.columns)
Out[2]: MultiIndex(
levels=[['20052065', '20052066', '20052082', '20052087', '20052089'],
['CTF1', 'CTF2', 'CTF3', 'CTF_M', 'CTM1', 'CTM2', 'CTM3', 'CTM_M']],
labels=[[...]],
names=[...])
如果它嘗試從1. level獲取2. level值和selected元素的數據,我得到以下輸出:
In[3]: print(df['20052065'][['CTF1','CTF_M']])
Out[3]: TIME[s] CTF1 CTF_M
0.000 -14.386 14.963
60.000 -26.937 34.729
120.000 -29.986 58.265
... ... ...
現在我嘗試生成2個元素的輸出,並做了類似這樣的事情:
In[4]: print(df[['20052065','20052066']][['CTF1','CTF_M']])
Out[4]: KeyError: "['CTF1' 'CTF_M'] not in index"
不知怎的,這不起作用。 也許你知道可怕的出了什么問題?
感謝幫助。
編輯: In[1]: print(df)
看起來像:
Out[1]: ELEMENT 20052065 20052066 20052082 20052087 20052089 20052090 \
TIME[s] TEMP[C] CTF1 CTF1 CTF1 CTF1 CTF1 CTF1
0.000 24.000 -4.234 -6.728 -14.386 -4.356 -6.926 -10.205
60.000 36.137 -29.308 -24.795 -26.937 -30.134 -24.735 -23.474
... ... ... ... ... ... ... ...
* .txt文件如下所示:
你可以使用df.loc
:
import numpy as np
import pandas as pd
columns = pd.MultiIndex.from_product([['A','B','C'],['X','Y','Z']])
df = pd.DataFrame(np.random.randint(10, size=(3,len(columns))), columns=columns)
# A B C
# X Y Z X Y Z X Y Z
# 0 2 7 5 1 6 0 5 0 0
# 1 8 4 7 2 0 8 7 3 9
# 2 0 6 8 8 1 1 8 0 2
# In some cases `sort_index` may be needed to avoid UnsortedIndexError
df = df.sort_index(axis=1)
print(df.loc[:, (['A','B'],['X','Y'])])
收益率(類似):
A B
X Y X Y
0 2 7 1 6
1 8 4 2 0
2 0 6 8 1
如果您只想選擇('A','Y')
和('B','X')
列,請注意您可以將MultiIndexed列指定為元組:
In [37]: df.loc[:, [('A','Y'),('B','X')]]
Out[37]:
A B
Y X
0 7 1
1 4 2
2 6 8
甚至只是df[[('A','Y'),('B','X')]]
(產生相同的結果)。
一般來說,最好使用單個索引器,如df.loc[...]
而不是雙索引(例如df[...][...]
)。 它可以更快(因為它對__getitem__
的調用較少,並且生成較少的臨時子數據幀)和df.loc[...] = value
它是對 DataFrame的子切片進行賦值的正確方法 ,它修改了df
本身。
df[['A','B']][['X','Y']]
不起作用的原因是因為df[['A','B']]
返回帶有MultiIndex的DataFrame:
In [36]: df[['A','B']]
Out[36]:
A B
X Y Z X Y Z
0 2 7 5 1 6 0
1 8 4 7 2 0 8
2 0 6 8 8 1 1
因此,使用['X','Y']
索引此DataFrame會失敗,因為沒有名為'X'
或'Y'
頂級列標簽。
有時,根據DataFrame的構造方式(或由於在DataFrame上執行的操作),MultiIndex需要在被切片之前進行排序。 在提及此問題的文檔中有一個盒裝警告 。 要使用lexsort列索引
df = df.sort_index(axis=1)
我認為需要切片機 :
print (df)
20052065 20052066 20052065 20052066 20052065 20052066
CTF1 CTF_M CTF_M1 CTF_Mr V A
0 1 2 4 5 6 7
df = df.sort_index(axis=1)
idx = pd.IndexSlice
print (df.loc[:, idx[['20052065','20052066'], ['CTF1','CTF_M']]])
20052065 20052066
CTF1 CTF_M
0 1 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.