Python + Pandas:根据另一个csv在csv中更新ONE列

时间:2015-10-10 10:25:07

标签: python csv pandas

我有两个相似的表(“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 但看起来提议的“合并”解决方案并不能满足我的需求,因为我有很多专栏?

1 个答案:

答案 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]