原始数据框:
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保持不变。 我还需要将结果存储在原始数据框中。
答案 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
默认为按索引对齐,并且行为得到完全控制。