熊猫替换列值之一

时间:2020-02-06 16:36:16

标签: python pandas

原始数据框:

    DocID   DocURL                       DocName    SiteURL LibraryURL
0   29806   path/to/doc/docname1.doc    docname1    web/url lib/url
1   29807   path/to/doc/docname2.doc    docname2    web/url lib/url

新数据框:

    DocURL                   DocName    SiteURL LibraryURL
0   path/to/doc/newname.doc  newname    web/url lib/url

我要用新行替换DocID == 29806的行。

我尝试通过使用以下代码来实现此目的,但没有成功:

df.loc[:, df.columns != 'DocID'].loc[row_index] = new_df.iloc[0]

这:

df.loc[row_index][1:] = new_df.iloc[0]

对于第一个,我没有任何错误或警告,对于下一个,我没有得到:

试图在DataFrame的切片副本上设置一个值

现在,我希望/需要将原始数据框中的行替换为新数据框中的行,但是我需要将DocID保持不变。 我还需要将结果存储在原始数据框中。

4 个答案:

答案 0 :(得分:1)

一种方法可能是创建要替换的列的列表,然后使用to_numpy来避免任何对齐问题,例如:

cols_replace = ['DocURL','DocName','SiteURL','LibraryURL']
df.loc[row_index, cols_replace] = new_df.loc[0, cols_replace].to_numpy()

答案 1 :(得分:1)

只需使用df.update()即可获得所需的东西。

代码:

df=pd.DataFrame({'DocID':[29806,29807],'DocURL':['path/to/doc/docname1.doc','path/to/doc/docname2.doc'],
                'DocName':['docname1','docname2'],'SiteURL':['web/url','web/url'],
                'LibraryURL':['lib/url','lib/url']})

df2=pd.DataFrame({'DocURL':['path/to/doc/newname.doc'],
                'DocName':['newname'],'SiteURL':['web/url'],
                'LibraryURL':['lib/url']})

df.update(df2)

输出:

    DocID   DocURL                   DocName       SiteURL  LibraryURL
0   29806   path/to/doc/newname.doc  newname       web/url  lib/url
1   29807   path/to/doc/docname2.doc docname2      web/url  lib/url
在这种情况下,

df.update()将用df中的新值更新df2中的原始值。更新将基于索引完成。因此,请确保df2中的索引号与df中的索引号匹配。

答案 2 :(得分:1)

尝试一下:

df.loc[df['DocID'] == '29806', ['DocURL', 'DocName', 'SiteURL', 'LibraryURL']] = dfNew.iloc[0]['DocURL', 'DocName', 'SiteURL', 'LibraryURL']

答案 3 :(得分:1)

new_df["DocID"] = [29806]

old_df.set_index("DocID")
new_df.set_index("DocID")

old_df.update(new_df)

您最好的选择是在新数据框中添加一个DocID列,并使用您要更新的旧数据框中的DocID填充它。然后,将DocID设置为索引。最后,调用.update默认为按索引对齐,并且行为得到完全控制。