使用set_index()更新Pandas系列/ df

时间:2019-01-05 06:32:49

标签: python-3.x pandas dataframe

考虑以下数据框:

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)) ,其中bdf中的ix匹配。像这样:

df1

我在这里错过了什么吗? df是否不是要在数据帧的副本中执行?谁能解释一下为什么会这样。

1 个答案:

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