Python+;熊猫:基于另一个csv更新csv中的一列

Python+;熊猫:基于另一个csv更新csv中的一列,python,csv,pandas,Python,Csv,Pandas,我有两个类似的表(“hist.csv”): 以及(“new.csv”): 如果“url”列匹配,我想用历史.Time值更新新的.Time列。 i、 e.此处所需输出,url“A”已更新: New2 : id | url | url2 | url3 | Time 1 A Z K 5 2 G H I 11 我尝试了以下方法: Historical = pd.DataFrame.from_csv("hist.csv", inde

我有两个类似的表(“hist.csv”):

以及(“new.csv”):

如果“url”列匹配,我想用历史.Time值更新新的.Time列。 i、 e.此处所需输出,url“A”已更新:

New2 :
id | url | url2 | url3 | Time
1    A      Z      K      5
2    G      H      I      11
我尝试了以下方法:

Historical = pd.DataFrame.from_csv("hist.csv", index_col='id', sep='\t', encoding='utf-8')
New = pd.DataFrame.from_csv("new.csv", index_col='id', sep='\t', encoding='utf-8')

for index, row in New.iterrows():
    New.loc[index,'Time']=Historical.loc[historical['url'] == row['url'],'Time']

New.to_csv("new2.csv", sep='\t', encoding='utf-8')
提出:

 ValueError: Must have equal len keys and value when setting with an iterable
PS:我发现了这个帖子:
但是,建议的带有“merge”的解决方案似乎并不真正符合我的需要,因为我有很多列?

基本问题是
Historical.loc[Historical['url']==row['url'],'Time']
返回一个序列(即使只有一行或没有一行条件-
Historical['url']==row['url']
-匹配)。范例-

In [15]: df
Out[15]:
   A  B
0  1  2
1  2  3

In [16]: df.loc[df['A']==1,'B']
Out[16]:
0    2
Name: B, dtype: int64
然后尝试将此数据帧设置为新数据帧的单个单元格,这就是问题的原因

因为在你的评论里-

我可能在历史记录中有几行带有“url”,但它们将具有相同的时间值。在这种情况下,我应该考虑第一次出现/匹配。< /P> 代码的一个快速修复方法是检查另一个数据帧中是否存在
行['url']
,并且只有在为true时,才使用-

for index, row in New.iterrows():
    if row['url'] in Historical['url'].values:
        row['Time']=Historical.loc[Historical['url'] == row['url'],'Time'].values[0]

您确定历史csv中只有一个url值吗?我可能有几行历史记录中有“url”,但它们的时间值相同。在这种情况下,我应该考虑第一次出现/匹配。谢谢你,阿南德。然而,使用此修复程序,我正在更新行['Time'],但我没有更新“New”数据帧,是吗?
是来自
的行,因此您只更新
。我在测试中遇到问题:“如果历史['url']中的行['url']:”这总是错误的。两个表中是否需要相同的索引?这不是我的情况。哦,对不起,您需要检查历史['url']中的
行['url']。值
。另一个只检查索引。我最终能够使用以下命令使其工作:New.loc[index,“Time']=Hist.loc[Hist['url']==row['url'],'Time']。值[0]
In [15]: df
Out[15]:
   A  B
0  1  2
1  2  3

In [16]: df.loc[df['A']==1,'B']
Out[16]:
0    2
Name: B, dtype: int64
for index, row in New.iterrows():
    if row['url'] in Historical['url'].values:
        row['Time']=Historical.loc[Historical['url'] == row['url'],'Time'].values[0]