考虑以下数据框:
Q
如果我们执行git
,这将更新数据帧-df = pd.DataFrame([["11","1", "2"], ["12","1", "2"], ["13","3", "4"]],
columns=["ix","a", "b"])
df1 = pd.DataFrame([["22","8", "9"], ["12","10", "11"], ["23","12", "13"]],
columns=["ix","c", "b"])
df df1
ix a b ix c b
0 11 1 2 0 22 8 9
1 12 1 2 1 12 10 11
2 13 3 4 2 23 12 13
的整个列df.update(df1)
和ix
,因为两个数据帧的索引号相同。
但是,我试图将b
列设置为两个数据帧的索引,并尝试更新第一个数据,如下所示:
df
但是,这不会返回任何内容。
我期望它返回一个数据帧,其中列ix
已更新为df_new = df.set_index('ix').rename_axis(None).update(df1.set_index('ix').rename_axis(None))
,其中b
和df
中的ix
匹配。像这样:
df1
我在这里错过了什么吗? df
是否不是要在数据帧的副本中执行?谁能解释一下为什么会这样。
答案 0 :(得分:1)
update
就地修改调用DataFrame。从文档中:
使用来自另一个DataFrame的非NA值进行修改。
按索引对齐。没有返回值。
因此,唯一的选择是预先将索引设置为一个单独的步骤。
df.set_index('ix', inplace=True)
df.update(df1.set_index('ix'))
df.reset_index()
ix a b
0 11 1 2
1 12 1 11
2 13 3 4
如果您想避免修改原件,这始终是另一种选择:
df_copy = df.set_index('ix')
df_copy.update(df1.set_index('ix'))
df_copy
a b
ix
11 1 2
12 1 11
13 3 4