首页 > 解决方案 > 如何添加增量列,为特定 ID 的 csv 中的每个新对象添加 +1

问题描述

我有一个 CSV 文件,其中包含药物(名称)和某些患者(id)服用的剂量信息。

CSV 文件的结构如下:

name, id, dose
ator, 034, 20
ator, 034, 30
para, 034, 30
mar, 035, 20
mar, 034, 10

目标是将其解析为“长”格式,具有以下列:“id”、“table”(代码中给出的表名)、字段(即名称、剂量)、值(即例如名称或剂量)。到目前为止,我已经成功地将原始 CSV 结构格式化为这个。

但是,我还想要一个“计数”列,其中包含每个患者服用的药物增量。例如,患者 id 为 034,服用三种药物(ator、para 和 mar),对应计数为 1、2 和 3。因此,所需的输出如下:

id,table,field,count,value
034, meds, name, 1, ator
034, meds, name, 1, ator
034, meds, name, 2, para
035, meds, name, 1, mar
034, meds, name, 3, mar
034, meds, dose, 1, 20
034, meds, dose, 1, 30
034, meds, dose, 2, 30
035, meds, dose, 1, 20
034, meds, dose, 3, 10

每次患者(即,id)获得一种新的药物(即,名称)时,“计数”应表示与例如表中稍后的剂量相对应的药物。

但我正在努力获得这样的计数列。

我试图通过我的代码(请参见下文)向数据框中添加一个计数列,但没有成功。

创建此专栏的任何帮助都会很棒!

import pandas as pd

# load the data into a pandas table:
file = '~/data/meds.csv'                   
df = pd.read_table(file, delimiter=',')

#### CANNOT GET THIS PART TO WORK: #####

count = []

for index, row in df.iterrows():
    count.append(df[(df['id'] == row['id']) & (df['name'] < row['name'])].shape[0])

df['count'] = count

########################################

# convert data frame into the long format
df = pd.melt(df, id_vars=['id', 'count'], var_name='field', value_name='value')

# Change all NaNs to None 
df = df.where((pd.notnull(df)), None)

# creating new column with table name
table = []
df['table'] = 'meds'

# save to file:
df.to_csv('~/data/meds_out.csv', encoding='utf-8')

标签: pythonpandascsv

解决方案


用于计数器列meltGroupBy.cumcount

df = pd.melt(df, id_vars='id', var_name='field', value_name='value')
#if constant value set this way
df['table'] = 'meds'

df['count'] = df.groupby(['id','field']).cumcount() + 1


#change order of columns if necessary
df = df[['id','table','field','count','value']]
print (df)
   id table field  count value
0  34  meds  name      1  ator
1  34  meds  name      2  para
2  35  meds  name      1   mar
3  34  meds  name      3   mar
4  34  meds  dose      1    20
5  34  meds  dose      2    30
6  35  meds  dose      1    20
7  34  meds  dose      3    10

编辑:

df['count'] = df.groupby('id')['name'].cumcount() + 1
df['count'] = df.groupby('id')['count'].ffill().astype(int)
df = pd.melt(df, id_vars=['id','count'], var_name='field', value_name='value')
print (df)
   id  count field value
0  34      1  name  ator
1  34      2  name  ator
2  34      3  name  para
3  35      1  name   mar
4  34      4  name   mar
5  34      1  dose    20
6  34      2  dose    30
7  34      3  dose    30
8  35      1  dose    20
9  34      4  dose    10

推荐阅读