与多级列名合并产生的数据框按名称过滤列
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
我无法过滤由基本数据框与来自具有多个输出列的 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