用另一个 df 中的行替换 Pandas df 中的行

新手上路,请多包涵

我有 2 个 Pandas dfs,A 和 B。它们都有 10 列和索引“ID”。如果 A 和 B 的 ID 匹配,我想用 A 的行替换 B 的行。我尝试使用 pd.update,但还没有成功。任何帮助表示赞赏。

原文由 Chris Parry 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

下面的代码应该可以解决问题

s1 = pd.Series([5, 1, 'a'])
s2 = pd.Series([6, 2, 'b'])
s3 = pd.Series([7, 3, 'd'])
s4 = pd.Series([8, 4, 'e'])
s5 = pd.Series([9, 5, 'f'])

df1 = pd.DataFrame([list(s1), list(s2),list(s3),list(s4),list(s5)],  columns =  ["A", "B", "C"])

s1 = pd.Series([5, 6, 'p'])
s2 = pd.Series([6, 7, 'q'])
s3 = pd.Series([7, 8, 'r'])
s4 = pd.Series([8, 9, 's'])
s5 = pd.Series([9, 10, 't'])

df2 = pd.DataFrame([list(s1), list(s2),list(s3),list(s4),list(s5)],  columns =  ["A", "B", "C"])

df1.loc[df1.A.isin(df2.A), ['B', 'C']] = df2[['B', 'C']]
print df1

输出

   A   B  C
0  5   6  p
1  6   7  q
2  7   8  r
3  8   9  s
4  9  10  t

从评论编辑:

要替换整行而不是仅替换某些列:

 cols = list(df1.columns)
df1.loc[df1.A.isin(df2.A), cols] = df2[cols]

原文由 Shijo 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以清空 A 中的目标单元格(通过将它们设置为 NaN)并使用 combine_first() 方法用 B 的值填充这些单元格。虽然这听起来可能违反直觉,但这种方法使您可以灵活地在 2 行代码中同时定位目标行和特定列。希望有所帮助。

替换具有索引匹配的完整行的示例:

 # set-up
cols = ['c1','c2','c3']
A = pd.DataFrame(np.arange(9).reshape((3,3)), columns=cols)
B = pd.DataFrame(np.arange(10,16).reshape((2,3)), columns=cols)

#solution
A.loc[B.index] = np.nan
A = A.combine_first(B)

仅替换具有索引匹配的行的某些目标列的示例:

 A.loc[B.index, ['c2','c3']] = np.nan
A = A.combine_first(B)

原文由 fpersyn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题