python - 如何添加增量列,为特定 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')
解决方案
用于计数器列melt
:GroupBy.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
推荐阅读
- nginx - 更改主机后域上的 301 www 重定向问题
- python - Pynput - 在不实际移动或单击光标的情况下模拟鼠标事件
- terraform - 如何查看远程状态 terraform 版本
- python - Python Web Scraping - 如何避免为我的数据库抓取重复项?
- wordpress - 结帐时运输类别发生冲突-Woocommerce
- google-chrome-extension - Chrome 扩展程序,仅在点击时允许网站访问的权限
- mongodb - MongoDB 聚合管道 $limit 将异常从字符串转换为 int
- php - Dropzone.js、Laravel 和多文件上传问题
- c++ - 具有重复字段的嵌套 protobuf 结构导致调试断言失败
- flutter - 如何显示编号 用户可以输入的字符数以及用户在 TextFormField Flutter 中输入的字符数