df1:
A B
0 2002-01-13 3.9
1 2002-01-13 1.9
2 2002-01-14 8.0
3 2002-01-14 9.0
我想为每个df1["C"]
群组创建一个新B
列,其值为A
。
输出应为:
A B C
0 2002-01-13 3.9 2.9
1 2002-01-13 1.9 2.9
2 2002-01-14 8.0 8.5
3 2002-01-14 9.0 8.5
现在我想将C
个值分配给每个A
组,另一个df2
。
df2:
A D
0 2002-01-13 Joseph
1 2002-01-13 Emma
2 2002-01-13 Michael
3 2002-01-14 Anna
4 2002-01-14 Yvonne
5 2002-01-14 Anthony
输出应为:
A D E
0 2002-01-13 Joseph 2.9
1 2002-01-13 Emma 2.9
2 2002-01-13 Michael 2.9
3 2002-01-14 Anna 8.5
4 2002-01-14 Yvonne 8.5
5 2002-01-14 Anthony 8.5
我试过了:
df1["C"] = df1.groupby("A")["B"].mean()
答案 0 :(得分:3)
您不必向df1添加列,您可以直接将group by df1中的值映射到df2。
df2['E'] = df2['A'].map(df1.groupby('A').B.mean())
A D E
0 2002-01-13 Joseph 2.9
1 2002-01-13 Emma 2.9
2 2002-01-13 Michael 2.9
3 2002-01-14 Anna 8.5
4 2002-01-14 Yvonne 8.5
5 2002-01-14 Anthony 8.5
答案 1 :(得分:2)
第一个问题transform
df1['C'] = df1.groupby('A').B.transform('mean')
第二次使用map
(注意我直接使用df1,因为我添加了drop_duplicates
)
df2['E']=df2.A.map(df1.drop_duplicates('A').set_index('A').C)
答案 2 :(得分:0)
第1部分
df['C'] = df.groupby('A')['B'].transform('mean')
您的代码无效的原因是groupby
对象返回由A
编制索引的系列。
第1部分& 2 强>
您可以通过将A
映射到每个数据框中的预先计算的groupby
对象来执行转换。
s = df1.groupby('A')['B'].mean()
df['C'] = df['A'].map(s)
df2['E'] = df2['A'].map(s)
答案 3 :(得分:0)
您可以使用
df['C'] = df['A'].replace(df.groupby('A')['B'].mean().to_dict())
答案 4 :(得分:0)
发布,因为其他人未提及使用pd.merge
或DataFrame.join
。
如果只需要最终输出:
pd.merge(df2, df1.groupby('A', as_index=False).B.agg('mean').rename(columns={'B':'E'}), on='A')
#outputs:
A D E
0 2002-01-13 Joseph 2.9
1 2002-01-13 Emma 2.9
2 2002-01-13 Michael 2.9
3 2002-01-14 Anna 8.5
4 2002-01-14 Yvonne 8.5
5 2002-01-14 Anthony 8.5
我预感到基于连接的解决方案将比给定大数据帧的基于地图的解决方案更快。