与多级列名合并产生的数据框按名称过滤列

column filtering by name on a dataframe resulting from a merge with multilevel column names

我无法过滤由基本数据框与来自具有多个输出列的 groupby 的另一个数据框合并产生的数据框的列。

让我更具体一点:

1) 我构建了我的 "strange" 数据框: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

给出:

Index([ 'X1', 'Y_true_x', ('X1', ''), ('Y', 'count'), ('Y', 'average'), ('Y', 'std'), 'Y_true_y'], dtype='object')

重点是:

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

不起作用,而:

df2[['X1']]

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

工作。

有什么诀窍?最佳做法是什么?

谢谢,

丹尼斯

问题是您在列中得到 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

编辑:

如果需要 select 原始输出的两列都需要元组:

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