2016-10-28 78 views
1

我發現了loc的一些有趣的行爲(bug?),帶有多索引數據幀,其中第一個索引是單個索引。使用loc(第一次)後,第一個索引(多索引)消失!pandas loc修改多索引dataFrame?

例如:

In [1]: import pandas as pd 

In [2]: x = pd.DataFrame({'idx1':[1]*10, 'idx2':[1]*5+[2]*5, 'idx3':range(5)+range(5), 'data': [1]*10}) 

In [3]: x = x.set_index(['idx1', 'idx2', 'idx3']).sortlevel() 

我的數據框:

In [5]: x.loc[1,:,:] 
Out[5]: 
      data 
idx2 idx3 
1 0  1 
    1  1 
    2  1 
    3  1 
    4  1 
2 0  1 
    1  1 
    2  1 
    3  1 
    4  1 

現在數據框中只有兩個指標:

In [6]: x 
Out[6]: 
      data 
idx2 idx3 
1 0  1 
    1  1 
    2  1 
    3  1 
    4  1 
2 0  1 
    1  1 
    2  1 
    3  1 
    4  1 
用於第一次

In [4]: x 
Out[4]: 
       data 
idx1 idx2 idx3 
1 1 0  1 
      1  1 
      2  1 
      3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

祿

這不會發生「IDX1」當有多個值:

In [7]: x = pd.DataFrame({'idx1':[1]*3+[2]*7, 'idx2':[1]*5+[2]*5, 'idx3':range(5)+range(5), 'data': [1]*10}) 

In [8]: x = x.set_index(['idx1', 'idx2', 'idx3']).sortlevel() 

In [9]: x 
Out[9]: 
       data 
idx1 idx2 idx3 
1 1 0  1 
      1  1 
      2  1 
2 1 3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

In [10]: x.loc[1,:,:] 
Out[10]: 
       data 
idx1 idx2 idx3 
1 1 0  1 
      1  1 
      2  1 

In [11]: x 
Out[11]: 
       data 
idx1 idx2 idx3 
1 1 0  1 
      1  1 
      2  1 
2 1 3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

這是正常的行爲呢?如何避免這種情況?

Python 2.7版32位,熊貓== 0.16.2,numpy的== 1.11.1 + MKL

回答

2

我認爲更好的選擇是與slicers,療法它返回相同的輸出 - 所有層面:

x = pd.DataFrame({'idx1':[1]*10, 'idx2':[1]*5+[2]*5, 'idx3':list(range(5))+list(range(5)), 'data': [1]*10}) 
x = x.set_index(['idx1', 'idx2', 'idx3']).sortlevel() 
print (x) 
       data 
idx1 idx2 idx3  
1 1 0  1 
      1  1 
      2  1 
      3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

idx = pd.IndexSlice 
print (x.loc[idx[1,:,:],:]) 
       data 
idx1 idx2 idx3  
1 1 0  1 
      1  1 
      2  1 
      3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

如果需要刪除級別,使用xs與參數drop_level

print (x.xs(1, level=0, drop_level=True)) 
      data 
idx2 idx3  
1 0  1 
    1  1 
    2  1 
    3  1 
    4  1 
2 0  1 
    1  1 
    2  1 
    3  1 
    4  1 

print (x.xs(1, level=0, drop_level=False)) 
       data 
idx1 idx2 idx3  
1 1 0  1 
      1  1 
      2  1 
      3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

二樣本:

x = pd.DataFrame({'idx1':[1]*3+[2]*7, 'idx2':[1]*5+[2]*5, 'idx3':list(range(5))+list(range(5)), 'data': [1]*10}) 

x = x.set_index(['idx1', 'idx2', 'idx3']).sortlevel() 
print (x) 
       data 
idx1 idx2 idx3  
1 1 0  1 
      1  1 
      2  1 
2 1 3  1 
      4  1 
    2 0  1 
      1  1 
      2  1 
      3  1 
      4  1 

idx = pd.IndexSlice 
print (x.loc[idx[1,:,:],:]) 
       data 
idx1 idx2 idx3  
1 1 0  1 
      1  1 
      2  1 
print (x.xs(1, level=0, drop_level=True)) 
      data 
idx2 idx3  
1 0  1 
    1  1 
    2  1 

print (x.xs(1, level=0, drop_level=False)) 
       data 
idx1 idx2 idx3  
1 1 0  1 
      1  1 
      2  1 
+0

非常感謝,現在它的工作! :) – jdzejdzej

相關問題