kateli1991

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



我有两张相似的桌子(“历史.csv“):

Historical :
id | url | url2 | url3 | Time
1    A      B      C      5
2    D      E      F      8

以及(“新建.csv“):

^{pr2}$

我想更新新的。时间带有历史。时间值,如果“url”列匹配。 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:我发现了这条线: Updating a DataFrame based on another DataFrame 但是,似乎建议的带有“merge”的解决方案并不真正适合我的需要,因为我有很多专栏?在


已被浏览了9618次
6 日,19 小时 之前提问
1 个回答
fefe Tyson

基本问题是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设置为NewDataFrame的一个单元格,这就是导致问题的原因。在

因为在你的评论里-

I may have several rows with "url" in Historical, but they will have the same Time value. In that case, I should consider the first occurence/match.

代码的一个快速修复方法是检查row['url']是否存在于另一个数据帧中,并且仅当为true时,使用-

^{2}$
评论 - 2020年7月29日 10:44

最新Python问答

推荐Python问答