我有几个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