【问题标题】:pandas: unstack rows into new columns熊猫:将行取消堆叠到新列中
【发布时间】:2020-06-22 13:43:22
【问题描述】:

我有一个看起来像这样的 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

我该怎么做?

【问题讨论】:

    标签: python pandas pivot


    【解决方案1】:

    GroupBy.cumcount 用于MultiIndex 的辅助计数器并通过DataFrame.unstack 进行整形,然后使用DataFrame.sort_indexmap 用于扁平化MultiIndex 的正确顺序:

    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
    

    或者如果由于不同的列名称而无法进行排序,一种想法是使用DataFrame.reindex

    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
    

    【讨论】:

    • 谢谢。如果我有另一列对于“a”中的每个组只有 1 个唯一值,并且我想保留该列但不“复制”它,该怎么办?
    • @idt_tt 然后将df.set_index(['a',df.groupby('a').cumcount().add(1)]) 更改为df.set_index(['a','col', df.groupby(['a', 'col1'] ).cumcount().add(1)])
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多