gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:04:33 25 4
gpt4 key购买 nike

我有两个这样的数据框

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 的 C、D 列在 A 中获得相同的列值时,我想通过 df2 更新它们(如果 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com