熊猫 - 如何正确转置列

时间:2018-04-18 16:29:18

标签: python pandas

我有一个这样的数据框:

name_by_day    name      a   b
-------------------------------
20170901    2017090101  118 241
20170901    2017090102  117 241
20170901    2017090103  88  241
20170901    2017090104  99  241
20170901    2017090105  87  241

我只想要以下内容:

name_by_day   a_x b_x a_y b_y a_z b_z ...
---------------------------------------------------
20170901      118 241 117 241 88 241 99 241 87  241

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用stack,然后使用cumcount创建可以代表您的x,y,z的唯一键。

s=df.set_index('name_by_day')[['a','b']].stack().to_frame('Value')
s['New']=s.groupby(level=[0,1]).cumcount().astype(str)
s=s.set_index(s['New'],append=True).Value.unstack([1,2])
s.columns=s.columns.map('{0[0]}_{0[1]}'.format)


s
Out[1077]: 
             a_0  b_0  a_1  b_1  a_2  b_2  a_3  b_3  a_4  b_4
name_by_day                                                  
20170901     118  241  117  241   88  241   99  241   87  241

答案 1 :(得分:1)

试试@Wen解决方案:

import string
df_out = df.set_index(df.groupby('dname_by_day').cumcount()[::-1]\
           .map(lambda x: string.ascii_lowercase[-(x+1)]))
df_out = df_out.set_index('dname_by_day', append=True)[['a','b']].unstack(0)\
               .sort_index(level=1, axis=1)
df_out.columns = df_out.columns.map('_'.join)
df_out = df_out.reset_index()
df_out

输出:

   dname_by_day  a_v  b_v  a_w  b_w  a_x  b_x  a_y  b_y  a_z  b_z
0      20170901  118  241  117  241   88  241   99  241   87  241