使用 python [duplicate] 在 2 个 CSV 文件中查找相等值

finding equal values in 2 CSV files with python [duplicate]

提问人:Xara 提问时间:11/12/2023 最后编辑:Xara 更新时间:11/12/2023 访问量:68

问:

我有 2 个 excel 文件,每个文件包含 2 列,如下所示:

文件1:

name     price
a        1
b        78
f        54
g        32
t        2

文件2:

name     price
f        4
x        23
e        76
a        4
o        0

我想读取和搜索 name 等于 name 的值并提取价格,然后将它们写在 的价格列中。file1file2file1file2

file2应如下所示:

文件2:

name     price
f        54
x        23
e        76
a        1
o        0

我已经尝试了以下方法(我已将 excel 文件保存为 CSV):

import pandas as pd
import numpy as np

df1  = pd.DataFrame(pd.read_csv('file1.csv'))
df2  = pd.DataFrame(pd.read_csv('file2.csv'))

if(df1[name] in df2[name]):
  df2[price] = df1[price]
  
df2.to_csv('file2.csv')
python 熊猫 numpy csv

评论

0赞 tripleee 11/12/2023
这些看起来像 TSV 文件,而不是 CSV。您能否编辑以澄清这一点,如果这是您在文件中实际拥有的分隔符,则将分隔符更改为逗号,或者如果您真的没有,请更改措辞以不建议您具有逗号分隔值格式。(当然,如果这种误解是导致您出现问题的原因,请简单地删除此问题,因为该问题不可重现。
0赞 tripleee 11/12/2023
使用 Pandas 和 Numpy 进行简单的文件操作是严重的矫枉过正,但如果您出于其他原因仍然需要它们,我想它们比 Python 标准库提供了一些有限的额外便利。
0赞 Xara 11/12/2023
@tripleee最短的方法是什么?有没有办法在不将 CSV 文件转换为 DF 的情况下操作它们?
1赞 Umar.H 11/12/2023
您这边的一些语法错误会返回一个对象,因此无需将其包裹起来,请参阅重复的帖子,它现在和将来都会非常有帮助pd.read_csvpd.DataFramepd.read_csv

答:

0赞 gtomer 11/12/2023 #1

您需要先合并:

df2 = df2.merge(df1, on='name', how='left')

然后你可以使用 np.where:

import numpy as np
df2['price'] = np.where(df2['price_y'].isnull(), df2['price_x'], df2['price_y'])

稍后,您可以删除合并的列:

df2.drop(columns=['price_x', 'price_y'], inplace=True)

结果如下:

name     price
f        54
x        23
e        76
a        1
o        0
0赞 Panda Kim 11/12/2023 #2

法典

combine_first

df1.set_index('name').combine_first(df2.set_index('name'))\
   .reindex(df2['name']).reset_index()

似乎提问者不了解熊猫,所以我将输出结果作为图像附上。inplace

enter image description here

其他方式:使用concat & groupby + last

pd.concat([df2, df1]).groupby('name').last()\
  .reindex(df2['name']).reset_index()

相同的结果

其他方式:merge & pop

df2.merge(df1, on='name', how='left', suffixes=['1', ''])\
   .assign(price=lambda x: x['price'].fillna(x.pop('price1')).astype('int'))

相同的结果


示例代码

import pandas as pd
import io

file1 = '''name     price
a        1
b        78
f        54
g        32
t        2
'''

file2 = '''name     price
f        4
x        23
e        76
a        4
o        0
'''
df1 = pd.read_csv(io.StringIO(file1), sep='\s+')
df2 = pd.read_csv(io.StringIO(file2), sep='\s+')