【问题标题】:Comparing 2 columns with different rows in different csv files, and output status to another csv file比较不同csv文件中不同行的2列,并将状态输出到另一个csv文件
【发布时间】:2021-06-03 05:26:25
【问题描述】:

我有 2 个以下格式的 csv 文件。它们包含不同数量的行,并且列未在同一索引处对齐/排序。我需要比较两个文件上的 fname 列,如果它们相同,则必须检查 place 是否也相同,并将状态输出 true,false 到另一个带有 fname,place,status 列的 file3.csv。

file1.csv

fname.   age.  place 

Andy     16    a
kate.    15.   k
brian.   17.   b

file2.csv

fname.   age.  place

brian.  17.   c
kate.   15.   k
andy.   16.   a
laura.  18.   l

output file3.csv should be like
Andy.   a.   true
Kate.   k.   true
brian.  b.   false


我见过很多类似的查询,但它们要么有相同的行数,要么在同一个索引中排序和对齐。

我尝试过使用 pandas,但没有奏效,因为行不同。

【问题讨论】:

  • 请澄清用于创建第三个文件的逻辑。例如,如果 file1.fname.lower() == file2.fname.lower() 使用 file1fname 值。什么决定了 file3 是否包含一个真正的错误条件?什么决定了 file3 是否不包含 fname 值的条目?

标签: python python-3.x csv


【解决方案1】:

这是一种可以使用 pandas 的方法:

import pandas as pd

将文件读入 panda 数据帧

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

为每个数据帧创建一个公共键

df1['lk'] = df1.apply(lambda row: row['fname'].lower(), axis= 1)  
df2['rk'] = df2.apply(lambda row: row['fname'].lower(), axis= 1)  

将帧合并到第三个df中,并添加标志列

df3 = df1.merge(df2, left_on='lk', right_on='rk')
df3['flag'] = df3.apply(lambda row: row['place_x'] == row['place_y'], axis = 1)

重命名 fname_x 和 place_X 列

df3.rename(columns={'fname_x':'fname', 'place_x':'place'}, inplace=True)

创建输出 csv 文件

df3[['fname', 'place', 'flag']].to_csv('file3', index=False)
 

【讨论】:

  • 效果很好,但我在输出文件中看到重复值
  • 如果我想要输出文件中的真/假状态怎么办?而不是只匹配 true 的行
  • 真/假是什么意思?当 df1 中的地点数据与 df2 中的地点数据匹配时,我提供的方法产生 True,否则它产生 False
  • 我看到的唯一问题是您的某些数据包含 .最后,我认为这是您的错字,如果是这种情况,则通过将 row['fname'].lower() 更改为 row['fname'].lower()[:-1] 来修改“lk”和“rk”创建。
猜你喜欢
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
相关资源
最近更新 更多