使用pandas

时间:2018-03-14 16:38:27

标签: python pandas dataframe

我有一个包含“pid”,“code”,“type”和“note”列的数据框。每个pid(患者id)与诊断和医学相结合。它们都有代码和注释(参见示例)。每个代码都有几个注释。如何用相应的第一个看到的音符和类型替换所有代码?执行for循环不是一种选择。

请注意,例如,代码A在IN中同时具有alvedon和ipren,但在OUT中只有alvedon。这样做,我可以通过名称而不是代码来识别它们。

在:

pid  code  type  note
1    A     M     alvedon
1    B     D     pain
1    C     M     ulcer
2    A     M     ipren
2    B     D     hurt
3    A     M     alvedon
3    B     D     hurt
3    C     M     stomach
4    A     M     ipren
4    B     D     pain
5    A     M     ipren
5    B     D     pain

OUT:

pid  code
1    A_M_alvedon
1    B_D_pain
1    C_M_ulcer
2    A_M_alvedon
2    B_D_pain
3    A_M_alvedon
3    B_D_pain
3    C_M_ulcer
4    A_M_alvedon
4    B_D_pain
5    A_M_alvedon
5    B_D_pain

我到目前为止:

df.groupby('code').note.agg(['first'])

但这只能给我分组:

OUT:

code  type  note
A     alvedon
B     pain
C     ulcer

2 个答案:

答案 0 :(得分:2)

你可以连接,然后像你正在做的那样对代码进行分组,然后转换:

In [9]: df["out"] = (
(df["code"] + "_" + df["type"] + "_" + df["note"]).groupby(df["code"]).transform("first"))

In [10]: df
Out[10]: 
    pid code type     note          out
0     1    A    M  alvedon  A_M_alvedon
1     1    B    D     pain     B_D_pain
2     1    C    M    ulcer    C_M_ulcer
3     2    A    M    ipren  A_M_alvedon
4     2    B    D     hurt     B_D_pain
5     3    A    M  alvedon  A_M_alvedon
6     3    B    D     hurt     B_D_pain
7     3    C    M  stomach    C_M_ulcer
8     4    A    M    ipren  A_M_alvedon
9     4    B    D     pain     B_D_pain
10    5    A    M    ipren  A_M_alvedon
11    5    B    D     pain     B_D_pain

答案 1 :(得分:1)

这是一种方式。您可以删除重复项并构建组合格式。然后按code映射到原始数据框。

df2 = df.drop_duplicates('code')
df2['comb'] = df2['code'] + '_' + df2['type'] + '_' + df2['note']

df['code'] = df['code'].map(df2.set_index('code')['comb'])
df = df[['pid', 'code']]

#     pid         code
# 0     1  A_M_alvedon
# 1     1     B_D_pain
# 2     1    C_M_ulcer
# 3     2  A_M_alvedon
# 4     2     B_D_pain
# 5     3  A_M_alvedon
# 6     3     B_D_pain
# 7     3    C_M_ulcer
# 8     4  A_M_alvedon
# 9     4     B_D_pain
# 10    5  A_M_alvedon
# 11    5     B_D_pain