【问题标题】:Compare multiple columns in two separate csv files and when they match parse for a matching string value比较两个单独的 csv 文件中的多个列,并在它们匹配时解析匹配的字符串值
【发布时间】:2020-12-15 23:53:02
【问题描述】:

我需要比较两个单独 csv 文件中的多列,当前 4 列在两个 csv 文件之间全部匹配时,创建一个具有匹配四列的新 csv 文件,然后添加第二个 csv 的第 5 列和第 7 列文件,并将第一个 csv 文件第 8 列解析为第二个 csv 文件中的任何列。如果它们匹配,则取后续列的值。我知道这听起来令人困惑,但下面显示了我正在尝试做的事情

第一个.csv

Address ID X Y col5 col6 col7 col8 col9 
Bob     16 1 2  x    x    x    ABC  #1
Jon     6  5 7  x    x    x    ABC  #2
Rem     16 4 9  x    x    x    ABC  #3
Bob     16 2 3  x    x    x    ABC  #4

第二个.csv

Address ID X Y col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 
Bob     16 1 2  x    x    x    def  #    ABC    #5   ghi    #    jkl   # 
Bob     16 1 3  x    x    x    def  #    ABC    #    ghi    #    jkl   #
Jon     6  5 7  x    x    x    def  #    ghi    #    ABC    #6   jkl   #
Jon     6  5 8  x    x    x    def  #    ghi    #    ABC    #    jkl   #
Rem     16 4 9  x    x    x    def  #    ghi    #    jkl    #    ABC   #7
Rem     16 4 8  x    x    x    def  #    ghi    #    jkl    #    ABC   #
Bob     16 2 3  x    x    x    ABC  #8   def    #    ghi    #    jkl   #
Bob     16 2 6  x    x    x    ABC  #    def    #    ghi    #    jkl   # 

输出.csv

Address ID X Y 1 2 3   4   5  6
Bob     16 1 2 x x x  ABC #1 #5
Jon     6  5 7 x x x  ABC #2 #6
Rem     16 4 9 x x x  ABC #3 #7
Bob     16 2 3 x x x  ABC #4 #8

我一直在尝试使用以下条件语句:

pathFirst = "C:\First.csv"
pathFinal  = "C:\Second.csv"

dataFirst = pd.read_csv(pathFirst)
dataFinal = pd.read_csv(pathFinal)

Output = pd.DataFrame(columns=['status'], index=dataFirst.index)
Output['status'] = (dataFirst['Address'] == dataFinal['address'] & dataFirst['ID'] == dataFinal['ID']).replace([True, False], ['Matching', 'Not Matching'])

Output.to_csv('C:\output.csv')

只是看看是否有一条线实际上比较正确,但似乎只有一对。我知道我做错了,我希望这能得到很好的解释,所以我非常感谢任何帮助。谢谢。

编辑: 我只希望前四列匹配。地址、ID、X、Y 之后,我想将 First.csv 文件中的第 4 列字符串值与 Second.csv 中第 4、6、8 或 10 列中的相同字符串值匹配。如果它们匹配,则从下一列中获取#value。因此,如果 Second.csv 第 1 行第 6 列与 First.csv 文件中的字符串匹配,那么我想要 Second.csv 第 1 行第 7 列 #value。

【问题讨论】:

  • 5 列如何匹配?两个 csv 文件的列 5 的值不同
  • 我只希望前四列匹配。地址、ID、X、Y 之后,我想将 csv 文件 1 中的第 4 列 sting 值与 csv 文件 2 中的第 4、6、8 或 10 列中的相同字符串值进行匹配。如果它们匹配,则从下一个中获取 #value柱子。因此,如果第 1 行第 6 列与第一个 csv 文件中的字符串匹配,那么我想要第 1 行第 7 列 #value。

标签: python pandas csv parsing


【解决方案1】:

试试这个

df1 = pd.read_csv('first.csv')
df2 = pd.read_csv('second.csv')

res = df1.merge(df2.iloc[:, :4], on=['Address', 'ID', 'X', 'Y'])

val = [np.where(df2[str(n)].isin(df1['4']), df2[str(n + 1)], np.nan) for n in range(4, 11, 2)]

res['6'] = pd.DataFrame(val).replace('#', np.nan).T.dropna(how='all').bfill(axis=1)[0].to_list()

print(res)

输出:

  Address  ID  X  Y  1  2  3    4   5   6
0     Bob  16  1  2  x  x  x  ABC  #1  #5
1     Jon   6  5  7  x  x  x  ABC  #2  #6
2     Rem  16  4  9  x  x  x  ABC  #3  #7
3     Bob  16  2  3  x  x  x  ABC  #4  #8

【讨论】:

  • 嘿,死神,我试过这个并遇到了几个错误。第一个是 np。我假设这是 import numpy as np.一旦我补充说我会得到一个 KeyError('4') 我认为这是这个 isin(df1['4'] 的一部分。
  • 你的列的数据类型是什么。如果不是字符串删除引号,它将起作用
  • csv文件中的列名是字符串,所有行的数据也是字符串值
  • 可以分享print(df.columns)的结果吗
  • 我必须更改这篇文章的列名,但使用 'print(res.columns)' 它给了我:Index(['Address', 'ID', 'X', 'Y' , 'String1', 'string2', 'string3','string4', 'Unnamed: 8'], dtype='object') 其中 string4 中的所有行都是我想用作比较的。
猜你喜欢
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多