使用两列连接多个CSV文件



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

第一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

并按顺序完成文件

任何帮助都将不胜感激

基本上需要在concat之后透视数据。

你可以这样继续:

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

在此之后,您需要pivot数据:

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

不使用任何外部库。
思路是将数据收集到字典中,遍历字典并创建输出。
1.csv &2.csv包含BP &人力资源数据。
扩展列表[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

你可以试试:

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

最新更新