我有两个相似的表(“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列。 即所需的输出,其中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:我找到了这个帖子: Updating a DataFrame based on another DataFrame 但看起来提议的“合并”解决方案并不能满足我的需求,因为我有很多专栏?
答案 0 :(得分:1)
基本问题是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
然后您尝试将此DataFrame设置为New
数据框的单个单元格,这就是造成此问题的原因。
因为你在评论中说 -
我可能在Historical中有几行“url”,但它们将具有相同的Time值。在这种情况下,我应该考虑第一次出现/匹配。
您的代码的快速修复方法是检查其他DataFrame中是否存在row['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]