如何将行值转换为pandas中的属性(列)

时间:2018-03-11 22:50:18

标签: python pandas dataframe attributes

我在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

3 个答案:

答案 0 :(得分:4)

IIUC 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

AttributeError: 'str' object has no attribute 'pLatin_converter'

答案 1 :(得分:2)

一种方法是pivot您的数据框

New-PSDrive

答案 2 :(得分:2)

玩得开心!

乐趣1

使用MultiIndex和unstack创建一个系列

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