Python 添加来自不同数据帧的值
我想为每个Python 添加来自不同数据帧的值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我想为每个a组创建一个新列df1[“C”],使用B值 输出应为: 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 df2: A D 0 2002-01-13 Joseph 1 2002-01-13 Emma 2 2002-01-13 Michael 3 2002-01-14 A
a
组创建一个新列df1[“C”]
,使用B
值
输出应为:
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
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
现在我想把C
值分配给每个A
组,分配给另一个df2
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
输出应为:
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
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
第1部分
df1["C"] = df1.groupby("A")["B"].mean()
代码不起作用的原因是groupby
对象返回一个由a
索引的序列
第1部分和第2部分
您可以通过将A
映射到每个数据帧中预先计算的groupby
对象来执行转换
df['C'] = df.groupby('A')['B'].transform('mean')
第一个问题
transform
s = df1.groupby('A')['B'].mean()
df['C'] = df['A'].map(s)
df2['E'] = df2['A'].map(s)
第二次使用map
(注意,我使用的是df1,这直接导致我添加了drop\u重复项
)
您不必向df1添加列,您可以直接将值从groupby df1映射到df2
df2['E']=df2.A.map(df1.drop_duplicates('A').set_index('A').C)
你可以用
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
因为其他人没有提到使用pd.merge
或DataFrame.join
,所以发布
如果只需要最终输出:
df['C'] = df['A'].replace(df.groupby('A')['B'].mean().to_dict())
我有一种预感,在给定大数据帧的情况下,基于连接的解决方案将比基于地图的解决方案更快。我会使用
assign
,但这是我的答案。@piRSquared,需要开始使用assign:)这与答案基本相同,但使用replace
。我认为您应该使用map
来代替。在我起草答案时,还发布了另外三个答案:)。我同意transform
或map
都比我的好。我认为df2.A.map(df1.set_index('A')['C'].to_dict())会更干净,你不需要删除副本,因为字典会处理它+1@Vaishali这是真的:-)