Python 熊猫:将行取消堆叠到新列中

Python 熊猫:将行取消堆叠到新列中,python,pandas,pivot,Python,Pandas,Pivot,我有一个df,看起来像这样: a date c 0 ABC 2020-06-01 0.1 1 ABC 2020-05-01 0.2 2 DEF 2020-07-01 0.3 3 DEF 2020-01-01 0.4 4 DEF 2020-02-01 0.5 5 DEF 2020-07-01 0.6 我想“取消堆叠”列“a”,因此我的新df如下所示 a date1 c1 date2 c2

我有一个df,看起来像这样:

     a        date    c
0  ABC  2020-06-01  0.1
1  ABC  2020-05-01  0.2
2  DEF  2020-07-01  0.3
3  DEF  2020-01-01  0.4
4  DEF  2020-02-01  0.5
5  DEF  2020-07-01  0.6
我想“取消堆叠”列“a”,因此我的新df如下所示

     a       date1   c1        date2   c2        date3   c3        date4   c4
0  ABC  2020-06-01  0.1   2020-05-01  0.2          nan  nan          nan  nan
1  DEF  2020-07-01  0.3   2020-01-01  0.4   2020-02-01  0.5   2020-07-01  0.6
如何执行此操作?

用于
多索引的辅助计数器和重塑,然后用于展平
多索引的
map
以获得正确的顺序:

df = (df.set_index(['a',df.groupby('a').cumcount().add(1)])
        .unstack()
        .sort_index(axis=1, level=[1, 0], ascending=[True, False]))
df.columns = df.columns.map(lambda x: f'{x[0]}{x[1]}')
df = df.reset_index()
print (df)
     a       date1   c1       date2   c2       date3   c3       date4   c4
0  ABC  2020-06-01  0.1  2020-05-01  0.2         NaN  NaN         NaN  NaN
1  DEF  2020-07-01  0.3  2020-01-01  0.4  2020-02-01  0.5  2020-07-01  0.6
或者,如果由于列名称不同而无法进行排序,则使用一种方法:


谢谢如果我有另一个列,在“a”中每个组只有一个唯一值,我想保留这个列,但不想“复制”它怎么办?@idt_tt然后将
df.set_索引(['a',df.groupby('a').cumcount().add(1)]
更改为
df.set_索引(['a','col',df groupby(['a','col1')).cumcount().add(1)]
df1 = df.set_index(['a',df.groupby('a').cumcount().add(1)])
mux = pd.MultiIndex.from_product([df1.index.levels[1], ['date','c']])
df = df1.unstack().swaplevel(1,0, axis=1).reindex(mux, axis=1)
df.columns = df.columns.map(lambda x: f'{x[1]}{x[0]}')
df = df.reset_index()
print (df)
     a       date1   c1       date2   c2       date3   c3       date4   c4
0  ABC  2020-06-01  0.1  2020-05-01  0.2         NaN  NaN         NaN  NaN
1  DEF  2020-07-01  0.3  2020-01-01  0.4  2020-02-01  0.5  2020-07-01  0.6