从不同的数据框中添加值

3
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"],其中包含每个A组的B值的平均值。
输出应该是:
            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()
5个回答

3

您不需要在 df1 中添加一列,可以直接将 groupby 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
我会使用 assign 但这是我的答案。 - piRSquared
@piRSquared,需要开始使用赋值操作 :) - Vaishali

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)

我认为df2.A.map(df1.set_index('A')['C'].to_dict())会更加简洁,你不需要使用drop_duplicates,因为字典会自动处理它。+1 - Vaishali
@Vaishali 这是真的:-) - BENY

0

第一部分

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)

0

您可以使用

df['C'] = df['A'].replace(df.groupby('A')['B'].mean().to_dict())

这基本上与@Vaishali的答案相同,但使用replace代替。我认为你应该使用map - piRSquared
当我在写我的答案时,已经有其他三个答案发布了:)。我同意使用transformmap比我的方法更好。 - Wei Zhang

0

在此发帖,因为其他人没有提到使用pd.mergeDataFrame.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

我有一种预感,基于连接的解决方案将比基于映射的解决方案在大型数据框中运行得更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接