【问题标题】:Concatenate several CSV files using two columns使用两列连接多个 CSV 文件
【发布时间】:2021-11-06 11:18:06
【问题描述】:

我有几个 csv 文件,一个用于患者血压,另一个用于心率、WBc 等,用于同一患者和同一小时测量,请参阅以下示例

第一个 csv:

    subject_id     hour_id    value         label
    
    1                 1           96        blood pressure
    1                 1           94        blood pressure

    1                 1           93        blood pressure

    2                 2           99        blood pressure

第二个 csv:

    subject_id     hour_id    value        label
     
    1                 1           80        Heart rate
    
    2                 2           89        Heart rate
    2                 2           81        Heart rate

第三个csv:

    subject_id     hour_id    value        label
     
    1                 1           1        WBC
    
    2                 2           10       WBC
    2                 2           12       WBC

第四个 csv:

    subject_id     hour_id    value        label
     
    1                 1         123        glucose
    
    2                 2        111           glucose
    2                 2        113           glucose

期望的输出:

    subject_id     hour_id     blood_pressure    heart rate    WBC     gloucose
    
    1                 1           96               80           1         123
    
    2                 2           99               89           10         120    

我试过了:

df = pd.read_csv('D:\\....', low_memory=False, error_bad_lines=False)
df2 = pd.read_csv('D:\\Users', low_memory=False, error_bad_lines=False)
merged = pd.concat([df, df2,df3,df4], axis=1, keys=['subject_id', 'hour_mesaure'])
print(merged)

但它给了我:

  subject_id     hour_id        blood_pressure     
    
    1                 1              96           
         
    2                 2               99   


   subject_id     hour_id    value        label
     
    1                 1           80        Heart rate
    
    2                 2           89        Heart rate

并按顺序完成文件

任何帮助将不胜感激

【问题讨论】:

  • 为什么选择 python 2.7 和 python 3.x - 你有计划在 python 2.7 上运行代码吗?
  • 不只是想让所有对python感兴趣的人都能看到
  • 2.7 不应使用,除非您有充分的理由使用它。我将删除此标签。
  • 我认为它已经被删除了
  • 它是(由我 :-))

标签: python python-3.x csv


【解决方案1】:

你可以试试这个:

import pandas as pd


df1 = pd.read_csv('1.csv')
df2 = pd.read_csv('2.csv')
df3 = pd.read_csv('3.csv')
df4 = pd.read_csv('4.csv')

dfs = [df1, df2, df3, df4]

df = pd.concat(dfs)
df = df.pivot(index=['subject_id', 'hour_id'], columns='label', values='value').reset_index().rename_axis(index=None, columns=None)

print(df)

输出:

   subject_id  hour_id  Heart rate  WBC  blood pressure  glucose
0           1        1          80    1              96      123
1           2        2          89   10              99      120

在线现场演示链接:https://replit.com/@tssovi/test#main.py

【讨论】:

  • 我试过这个,但它也给了我以下错误“ValueError:索引包含重复的条目,无法重塑”
  • 我只是运行代码,它显示的结果与我在答案中添加的结果相同。您能否再试一次或分享您尝试过的代码?
  • 那应该还有别的问题。
  • @NoraMahmoud 我只是更新了答案并添加了现场演示链接。你能试试吗?
  • 我知道我的问题出在哪里
【解决方案2】:

不使用任何外部库。
这个想法是将数据收集到一个字典中并迭代该字典并创建输出。
1.csv & 2.csv 包含 BP & HR 数据。
扩展列表[1, 2] 以添加更多输入文件。

输出以逗号分隔,但您可以根据需要更改它。

from collections import defaultdict

data = defaultdict(list)

for x in [1, 2]:
    with open(f'{x}.csv') as f:
        lines = [l.strip() for l in f.readlines() if l.strip()]
        for idx, line in enumerate(lines):
            if idx > 0:
                parts = line.split()
                data[(parts[0], parts[1])].append((parts[2], parts[3]))

with open('merged.csv','w') as f:
    for idx, (k, v) in enumerate(data.items()):
        if idx == 0:
            headers = ['subject_id', 'hour_id']
            headers.extend(x[1] for x in v)
            f.write(','.join(headers) + '\n')
        fields = [k[0], k[1]]
        fields.extend(x[0] for x in v)
        f.write(','.join(fields) + '\n')

输出

subject_id,hour_id,blood,Heart
1,1,96,80
2,2,99,89

【讨论】:

  • 这个解决方案对我来说看起来很复杂
  • 请告诉我在哪里导入 CSV 文件
  • csv 文件和 python 脚本应该在同一个文件夹中。试一试 - 它有效。将代码保存为 python 脚本(例如:'csv_merger.py')。运行它,你应该会看到输出。
【解决方案3】:

你基本上需要在 concat 之后旋转数据。

你可以这样继续:

merged = pd.concat([df, df2,df3,df4])

在此之后,您需要对数据进行透视:

merged.pivot(index = ['subject_id', 'hour_id'], columns = ['label'], values = ['value'])

【讨论】:

  • 我试过这个解决方案,但它给了我这个错误“ValueError:索引包含重复的条目,无法重塑”
猜你喜欢
  • 2018-04-27
  • 2014-01-14
  • 2020-11-03
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多