Pandas - 如何正确转置列

3

I have a dataframe like this:

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个回答

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

让我们尝试类似于@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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接