如何使用pandas转动这个基本表?

时间:2017-05-18 07:53:44

标签: python pandas pivot

enter image description here

我想要的是:

visit_id   atc_1   atc_2    atc_3     atc_4     atc_5  atc_6  atc_7
48944282   A02AG   J01CA04  J095AX02  N02BE01   R05X   NaN    NaN
48944305   A02AG   A03AX13  N02BE01      R05X   NaN    NaN    NaN

我不知道有多少atc_1 ... atc_7 ...?atc_100列需要提前。我只需要将所有关联的atc_codes与每个visit_id收集到一行。

这似乎是group_by然后是pivot,但我已多次尝试但失败了。我还尝试使用pandas'自行加入一个SQL。 merge()但这也不起作用。

最终结果是,我会将atc_1atc_7,... atc_100粘贴在一起形成一个长atc_code。此合约atc_code将是我的" Y"或"标签"我试图预测的数据集列。

谢谢!

1 个答案:

答案 0 :(得分:2)

首先使用cumcount来计算按功能pivot创建列的每个组的计数值。然后使用reindex_axis添加缺少的列,并按add_prefix更改列名称。最后reset_index

g = df.groupby('visit_id').cumcount() + 1
print (g)
0    1
1    2
2    3
3    4
4    5
5    1
6    2
7    3
8    4
dtype: int64

df = pd.pivot(index=df['visit_id'], columns=g, values=df['atc_code'])
       .reindex_axis(range(1, 8), 1)
       .add_prefix('atc_')
       .reset_index()

print (df)
   visit_id  atc_1    atc_2     atc_3    atc_4 atc_5  atc_6  atc_7
0  48944282  A02AG  J01CA04  J095AX02  N02BE01  R05X    NaN    NaN
1  48944305  A02AG  A03AX13   N02BE01     R05X  None    NaN    NaN