【问题标题】:Using pandas to join specific elements from three separate CSV files into one CSV file使用 pandas 将三个单独的 CSV 文件中的特定元素连接到一个 CSV 文件中
【发布时间】:2020-04-03 16:49:59
【问题描述】:

我有以下三个 CSV 文件:

1.csv:
id,status,env
aaaa,PASS,PROD
aaaa,PASS,DEV
bbbb,PASS,PROD
bbbb,PASS,DEV

2.csv:
id,successPct24,env
aaaa,"99.73",PROD
aaaa,"99.89",DEV
bbbb,"100.00",PROD
bbbb,"92.53",DEV

3.csv
id,successPctMonth,env
aaaa,"99.70",PROD
aaaa,"99.90",DEV
bbbb,"100.00",PROD
bbbb,"99.91",DEV

目标是创建一个格式如下的 CSV 文件:

id,status,successPct24,successPctMonth,env

因此,使用我的示例 CSV 文件,单个 CSV 应如下所示:

aaaa,PASS,99.73,99.7,PROD
aaaa,PASS,99.89,99.9,DEV
bbbb,PASS,100.0,100.0,PROD
bbbb,PASS,92.53,99.91,DEV

我已尝试使用以下 Python 代码来完成此操作...

import pandas as pd

csv1 = pd.read_csv("1.csv", index_col=[0], usecols=["id", "status"])

csv2 = pd.read_csv("2.csv", index_col=[0], usecols=["id", "successPct24"])

csv3 = pd.read_csv("3.csv", index_col=[0], usecols=["id", "successPctMonth", "env"])

firstcsv = csv1.join(csv2)

finalcsv = firstcsv.join(csv3)

# print (finalcsv)

finalcsv.to_csv('4.csv', index=True)

...但生成的单个 CSV 不正确:

aaaa,PASS,99.73,99.7,PROD
aaaa,PASS,99.73,99.9,DEV
aaaa,PASS,99.89,99.7,PROD
aaaa,PASS,99.89,99.9,DEV
aaaa,PASS,99.73,99.7,PROD
aaaa,PASS,99.73,99.9,DEV
aaaa,PASS,99.89,99.7,PROD
aaaa,PASS,99.89,99.9,DEV
bbbb,PASS,100.0,100.0,PROD
bbbb,PASS,100.0,99.91,DEV
bbbb,PASS,92.53,100.0,PROD
bbbb,PASS,92.53,99.91,DEV
bbbb,PASS,100.0,100.0,PROD
bbbb,PASS,100.0,99.91,DEV
bbbb,PASS,92.53,100.0,PROD
bbbb,PASS,92.53,99.91,DEV

我确定我缺少某个参数,或者我配置错误。对此请求的任何帮助将不胜感激。

【问题讨论】:

  • 最终的 csv 中缺少什么/不正确的?
  • 糟糕...忘记包括在内。刚刚编辑了我的帖子以反映我看到的不正确的 CSV 数据。

标签: python pandas csv


【解决方案1】:

您需要加入 2 列 - 'id' and 'env' 代码:

df1 = pd.read_csv("1.csv")
df2 = pd.read_csv("2.csv")
df3 = pd.read_csv("3.csv")
finalcsv = df1.merge(df2, 'left', on=['id', 'env']).merge(df3, 'left', on=['id', 'env'])

结果:

    id      status  env     successPct24    successPctMonth
0   aaaa    PASS    PROD    99.73           99.70
1   aaaa    PASS    DEV     99.89           99.90
2   bbbb    PASS    PROD    100.00          100.00
3   bbbb    PASS    DEV     92.53           99.91

如果您需要其他列顺序:

finalcsv = finalcsv[['id', 'status', 'successPct24', 'successPctMonth', 'env']]

【讨论】:

  • 这成功了...谢谢!我必须从@jcaliz 答案中添加一行以从输出中删除“0,1,2,3”。
  • 我没有在这段代码中使用列作为索引,因此要从 csv 中删除默认索引值 (0,1,2,3),您只需在 to_csv 中写入 index=False:@987654326 @
【解决方案2】:

join 函数总是使用索引来执行连接,并且您有多个记录共享同一个索引,如果您需要使用更多列进行连接,请使用merge

第一个解决方案只是分配列,但前提是它们的顺序相同:

temp = csv1.copy() 
temp['successPct24'] = csv2['successPct24']
temp['successPctMonth'] = csv3['successPctMonth']
temp['env'] = csv3['env']

print(temp)

第二种解决方案是使用merge,但是索引本身不够用所以需要使用env列:

csv1 = pd.read_csv("1.csv", usecols=["id", "status", "env"])
csv2 = pd.read_csv("2.csv", usecols=["id", "successPct24", "env"])
csv3 = pd.read_csv("3.csv", usecols=["id", "successPctMonth", "env"])

firstcsv = csv1.merge(csv2, left_on=["id", "env"], right_on=["id", "env"])
finalcsv = firstcsv.merge(csv3,  left_on=["id", "env"], right_on=["id", "env"])

finalcsv.set_index('id', inplace=True)

【讨论】:

  • 谢谢!我已经实现了@dmitriy-k 在您之前提供的解决方案,但我必须使用您的“finalcsv.set_index”行来修复输出。
  • 我认为我是第一个,但这并不重要,重要的是你得到了它。
猜你喜欢
  • 2019-08-25
  • 2018-11-22
  • 2022-01-05
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2020-12-06
相关资源
最近更新 更多