簡體   English   中英

Pandas MultiIndex,選擇1.和2.級別的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM