繁体   English   中英

Python + Pandas:基于另一个 csv 更新 csv 中的一列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM