[英]Python + Pandas : Update ONE column in csv based on another csv
我有两个相似的表(“hist.csv”):
Historical :
id | url | url2 | url3 | Time
1 A B C 5
2 D E F 8
和 ("new.csv") :
New :
id | url | url2 | url3 | Time
1 A Z K 9
2 G H I 11
如果“url”列匹配,我想用 Historical.Time 值更新 New.Time 列。 即此处所需的输出已更新,网址为“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:我发现了这个线程: 更新基于另一个数据帧的数据帧但是看起来建议的“合并”解决方案并不适合我的需求,因为我有很多列?
基本问题是, 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
然后您尝试将此数据帧设置为New
数据帧的单个单元格,这就是导致问题的原因。
因为在评论中你说 -
我可能有几行带有“url”的历史记录,但它们将具有相同的时间值。 在这种情况下,我应该考虑第一次出现/匹配。
对您的代码的快速修复是检查row['url']
是否存在于另一个 DataFrame 中,并且仅当为真时,才使用 -
for index, row in New.iterrows():
if row['url'] in Historical['url'].values:
row['Time']=Historical.loc[Historical['url'] == row['url'],'Time'].values[0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.