繁体   English   中英

如何在熊猫中将行值转换为属性(列)

[英]How to convert row values to attributes (columns) in pandas

我在pandas中有一个数据集,列为pid(患者ID)和代码(药物代码),如示例所示按行排序。 我需要将它们转换为1个患者/行,并列出所有药物作为每个患者的属性。

我现在所拥有的:

pid  code
1    Az
1    Bn
2    Az
2    Bn
2    C4
3    Bn
3    C4
3    Dx
4    Az
4    Bn
4    Dx
4    E
5    C4
5    Dx
5    E

我需要将其转换为:

pid  Az   Bn   C4   Dx   E
1    y    y    n    n    n
2    y    y    y    n    n
3    n    y    y    y    n
4    y    y    n    y    y
5    n    n    y    y    y

IIUC crosstab

pd.crosstab(df.pid,df.code).replace({1:'y',0:'n'})
Out[231]: 
code Az Bn C4 Dx  E
pid                
1     y  y  n  n  n
2     y  y  y  n  n
3     n  y  y  y  n
4     y  y  n  y  y
5     n  n  y  y  y

一种方法是旋转数据框

new_df = df.assign(values='y').pivot(index='pid', columns='code', values='values').replace({None:'n'})

>>> new_df
code Az Bn C4 Dx  E
pid                
1     y  y  n  n  n
2     y  y  y  n  n
3     n  y  y  y  n
4     y  y  n  y  y
5     n  n  y  y  y

正玩得开心!

有趣的1

创建具有MultiIndex的系列并拆栈

pd.Series('y', df.values.T.tolist()).unstack(fill_value='n')

  Az Bn C4 Dx  E
1  y  y  n  n  n
2  y  y  y  n  n
3  n  y  y  y  n
4  y  y  n  y  y
5  n  n  y  y  y

好玩2

使用defaultdict

d = defaultdict(dict)

for i, p, c in df.itertuples():
    d[c][p] = 'y'

pd.DataFrame(d).fillna('n')

  Az Bn C4 Dx  E
1  y  y  n  n  n
2  y  y  y  n  n
3  n  y  y  y  n
4  y  y  n  y  y
5  n  n  y  y  y

乐趣3

i, r = pd.factorize(df.pid)
j, c = pd.factorize(df.code)
e = np.empty((len(r), len(c)), str)
e.fill('n')
e[i, j] = 'y'
pd.DataFrame(e, r, c)

  Az Bn C4 Dx  E
1  y  y  n  n  n
2  y  y  y  n  n
3  n  y  y  y  n
4  y  y  n  y  y
5  n  n  y  y  y

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM