我有两个数据帧:df_s_T和df_data_T,并希望以列方式聚合(例如使用平均聚合函数)第二个数据框。这是我的例子:
ind = ['d1','d2','d3','d4']
my_data_ints = {'s1': [1, 2, 1, 2], 's2': [1, 2, 1, 1],'s3': [1, 1, 1, 1]}
df_s_T = pd.DataFrame(data=my_data_ints, index = ind).T
my_data = {'s1': [-1, 2, 5, 12], 's2': [-2, 2, 4, 10.5], 's3': [1, 2, 3, 4]}
df_data_T = pd.DataFrame(data=data, index = ind).T
这可以像这样可视化:
print df_data_T
print df_s_T
d1 d2 d3 d4
s1 -1.0 2.0 5.0 12.0
s2 -2.0 2.0 4.0 10.5
s3 1.0 2.0 3.0 4.0
d1 d2 d3 d4
s1 1 2 1 2
s2 1 2 1 1
s3 1 1 1 1
期望的输出(计算具有相等值的所有行的每列的平均值):
d1 d2 d3 d4
1 -0.66 2.0 4.0 7.25
2 nan 2.0 nan 12.00
在我的d1和d3列示例中,所需输出数据帧中第2行的值为nan,因为df_s_T数据帧中的列d1和d3中没有值“2”。
我成功完成的是通过固定列(例如最后一列)进行聚合,见下文
df_data_T_new = df_data_T.groupby(df_s_T.iloc[:,-1]).mean()
df_data_T_new
d1 d2 d3 d4
d4
1 -0.5 2.0 3.5 7.25
2 -1.0 2.0 5.0 12.00
我想创建一个智能解决方案,可能没有编写循环。它应该以某种方式首先获取df_data_T中的所有可能值,以便正确构建结果数据帧。
提前感谢这些提议。
也许想到使用zip
和concat
的结果
pd.concat([df1[x].groupby(df2[y]).mean() for x , y in zip(df1,df2)],axis=1)
Out[44]:
d1 d2 d3 d4
d4
1 -0.666667 2.0 4.0 7.25
2 NaN 2.0 NaN 12.00