添加来自不同数据框的值

时间:2018-04-03 17:47:11

标签: python python-3.x pandas dataframe

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()

5 个答案:

答案 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.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

我预感到基于连接的解决方案将比给定大数据帧的基于地图的解决方案更快。