2017-10-12 45 views
2

我無法過濾從基礎數據框與另一個來自具有多個輸出列的groupby之間的合併產生的數據框的列。從與多級別列名稱的合併產生的數據幀上按名稱列過濾

讓我更具體:

1)我建我的 「奇怪」 的數據幀:df_analyzed

n_elements = 1000; 
np.random.seed(1234); 
X1 = np.random.randint(10,size=n_elements)*2; 
X2 = np.random.normal(size=n_elements); 
Y = 4*X1+X2; 
df = pd.DataFrame({'X1':X1,'X2':X2,'Y':Y}) 
df_analyzed = df[['X1','Y']] .groupby('X1').agg([np.count_nonzero,np.mean,np.std]).rename(columns={'count_nonzero':'count','mean':'average'}).reset_index(); 

2)我建立我的基本數據幀:DF2

df2 = pd.DataFrame({'X1':np.array(range(10))*2,'Y_true':np.array(range(10))*2*4}) 

3)然後我合併X1

df2 = df2.merge(df_analyzed,on='X1', how='inner') 

我現在的問題:我如何可以通過名字過濾的列DF2

該問題處理df_analyzed的多級列名稱,該名稱使用圓括號生成組合名稱。

df2.columns 

給出:

指數([ 'X1', 'Y_true_x',( 'X1', ''),( 'Y', '計數'), ('Y 」, '平均'),( 'Y', 'STD'), 'Y_true_y'],D類 = '對象')

的一點是,:

df2[['X1', ('Y', 'average')]] 

不起作用,而:

df2[['X1']] 

df2[[ ('Y', 'average')]] 

做的工作。

有什麼竅門?最佳做法是什麼?

感謝,

丹尼斯

回答

0

問題是你在列得到MultiIndex

您需要爲agg,然後定義列Y所有工作不錯:

df_analyzed = (df.groupby('X1')['Y'] #<-define column 
       .agg([np.count_nonzero,np.mean,np.std]) 
       .rename(columns={'count_nonzero':'count','mean':'average'}) 
       .reset_index()) 
print (df_analyzed) 
    X1 count average  std 
0 0 93.0 0.060892 0.910723 
1 2 107.0 8.227543 1.037363 
2 4 107.0 15.860760 1.023521 
3 6 108.0 23.882749 1.022283 
4 8 97.0 31.887406 0.996574 
5 10 98.0 40.162716 0.987292 
6 12 89.0 48.109856 1.157019 
7 14 95.0 56.199991 0.978952 
8 16 90.0 63.932482 0.956221 
9 18 116.0 71.967112 0.941378 

編輯:

如果需要選擇你的原始輸出的兩列需要的元組:

print (df_analyzed[[('X1', ''), ('Y', 'average')]]) 
    X1   Y 
     average 
0 0 0.060892 
1 2 8.227543 
2 4 15.860760 
3 6 23.882749 
4 8 31.887406 
5 10 40.162716 
6 12 48.109856 
7 14 56.199991 
8 16 63.932482 
9 18 71.967112 
+0

謝謝,最終解決問題。這是最佳做法嗎?或者是沒有機會使用類似'df2 [['X1',('Y','average')]]'的列名過濾? – DenisM

+0

我認爲最好的是如果列平坦。 – jezrael

+0

我爲過濾添加解決方案。 – jezrael