python - pandas 通过另一个数据框更新数据框并按列分组

标签 python pandas

我有两个像这样的数据框

df1 = pd.DataFrame({'A': ['1', '2', '3', '4','5'],
                  'B': ['1', '1', '1', '1','1'],
                  'C': ['A', 'A1', 'A2', 'A3','A4'],
                  'D': ['B0', 'B1', 'B2', 'B3','B4'],
                  'E': ['A', 'A', 'S', 'S','S']})
df2 = pd.DataFrame({'A': ['1', '6', '9', '4'],
                  'C': ['c', 'c1', 'c2', 'c3'],
                  'D': ['d1', 'd1', 'd2', 'd3']})

当 df1 在 A 中获得相同的列值时,我想用 df2 更新 df1 的 C、D 列(如果 df1['A']==df2['A'] 则 df1['C']=df2[' C'] 和 df1['D']=df2['D'])

答案应该是这样的

      A  B   C   D  E
   0  1  1   c  d1  A
   1  2  1  A1  B1  A
   2  3  1  A2  B2  S
   3  4  1  c3  d3  S
   4  5  1  A4  B4  S

我尝试了df1.update(df2),但它只是用 df2 覆盖了 df1

>df1.update(df2)
>       A  B   C   D  E
     0  1  1   c  d1  A
     1  6  1  c1  d1  A
     2  9  1  c2  d2  S
     3  4  1  c3  d3  S
     4  5  1  A4  B4  S

我尝试了pd.merge(df1, df2,how='inner',on=['A'])仍然不是我想要的

   A  B C_x D_x  E C_y D_y
0  1  1   A  B0  A   c  d1
1  4  1  A3  B3  S  c3  d3

谁能给我一些建议吗? 谢谢

最佳答案

我认为这会更节省空间:

编辑添加

这可能更有效:

In [22]: df1,df2 = df1.align(df2,join='left',axis=0)

In [23]: df1
Out[23]: 
   A  B   C   D  E
0  1  1   A  B0  A
1  2  1  A1  B1  A
2  3  1  A2  B2  S
3  4  1  A3  B3  S
4  5  1  A4  B4  S

In [24]: df2
Out[24]: 
     A    C    D
0    1    c   d1
1    6   c1   d1
2    9   c2   d2
3    4   c3   d3
4  NaN  NaN  NaN

现在您可以找到一个列相等的 bool 数组,并使用基于 loc 的赋值来就地修改 df1 而无需额外的列:

In [26]: equal_rows = df1.A == df2.A

In [27]: df1.loc[equal_rows]
Out[27]: 
   A  B   C   D  E
0  1  1   A  B0  A
3  4  1  A3  B3  S

In [28]: df1.loc[equal_rows,['C','D']] = df2.loc[equal_rows,['C','D']]

In [29]: df1
Out[29]: 
   A  B   C   D  E
0  1  1   c  d1  A
1  2  1  A1  B1  A
2  3  1  A2  B2  S
3  4  1  c3  d3  S
4  5  1  A4  B4  S

如果您确实需要 df2,因为它原来是这样的:

In [30]: df2.dropna(how='all',axis=0, inplace=True)

In [31]: df2
Out[31]: 
   A   C   D
0  1   c  d1
1  6  c1  d1
2  9  c2  d2
3  4  c3  d3

原始答案

这是一种笨拙的方法,不节省空间:

In [13]: merged = pd.merge(df1,df2,how='left', on=['A'])

In [14]: merged
Out[14]: 
   A  B C_x D_x  E  C_y  D_y
0  1  1   A  B0  A    c   d1
1  2  1  A1  B1  A  NaN  NaN
2  3  1  A2  B2  S  NaN  NaN
3  4  1  A3  B3  S   c3   d3
4  5  1  A4  B4  S  NaN  NaN

In [15]: merged.fillna({'C_y':df1.C,'D_y':df1.D},inplace=True)
Out[15]: 
   A  B C_x D_x  E C_y D_y
0  1  1   A  B0  A   c  d1
1  2  1  A1  B1  A  A1  B1
2  3  1  A2  B2  S  A2  B2
3  4  1  A3  B3  S  c3  d3
4  5  1  A4  B4  S  A4  B4

In [16]: merged.drop(['C_x','D_x'],axis=1,inplace=True)

In [17]: merged
Out[17]: 
   A  B  E C_y D_y
0  1  1  A   c  d1
1  2  1  A  A1  B1
2  3  1  S  A2  B2
3  4  1  S  c3  d3
4  5  1  S  A4  B4

如果您想要原始名称:

In [20]: merged.rename(columns={"C_y":'C','D_y':'D'},inplace=True)

In [21]: merged
Out[21]: 
   A  B  E   C   D
0  1  1  A   c  d1
1  2  1  A  A1  B1
2  3  1  S  A2  B2
3  4  1  S  c3  d3
4  5  1  S  A4  B4

关于python - pandas 通过另一个数据框更新数据框并按列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39908914/

相关文章:

python - 获取 Azure VMSS 中实例的公共(public) IP?

python - 在 Pandas 中加入或合并覆盖

python - 值错误 : arrays must all be same length - print dataframe to CSV

python - 删除几列后从 0 开始重新分配列标签

python - 检测对比图像的纹理背景

python - 从管道对象中提取超参数

python - XGBoost报告eval-auc一直在下降,但是train-auc一直在上升,结果是否正常?

python - GraphQL - 'either/or' 用于多个必填输入字段

python - Pandas Series 用于计算另一个 Pandas Series 中的值

python - 检查前 n 行的值是否都大于当前行的值