【问题标题】:Dataframe - convert rows to columns - grouped by another columns数据框 - 将行转换为列 - 按另一列分组
【发布时间】:2021-08-26 21:46:03
【问题描述】:

我正在寻找如下转换数据框

原始数据集

Group Miles
A 23
A 20
A 24
A 25
B 12
B 17
B 16
B 19

我想从上面的格式转换成这个:

Col_A Col_B
23 12
20 17
24 16
25 19

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

通过pivot尝试:

df = df.assign(t= df.groupby('Group').cumcount()).pivot(index = 't', columns ='Group', values = 'Miles').add_prefix('Col_').rename_axis(columns = None).reset_index(drop = True)

或通过pd.concat:

k = pd.concat([g.reset_index(drop=True)['Miles'] for _,g in df.groupby('Group')], 1)
k.columns = ['colA', 'colB']

通过set_index/unstack提供更多选择:

k = df.set_index(['Group', df.groupby('Group').cumcount()]).unstack(0).add_prefix('Col_').rename_axis(columns= [None,None])
k.columns = k.columns.droplevel()

另一个通过groupby / explode

k = df.groupby('Group').agg(list).T.apply(pd.Series.explode).add_prefix('Col_')
k = k.reset_index(drop=True).rename_axis(columns = None)

输出:

   Col_A  Col_B
0     23     12
1     20     17
2     24     16
3     25     19

【讨论】:

    【解决方案2】:

    pivot_table 选项:

    df = (
        df.pivot_table(index=df.groupby('Group').cumcount(),
                       columns='Group',
                       values='Miles')
            .add_prefix('Col_')
            .rename_axis(columns=None)
    )
    

    df:

       Col_A  Col_B
    0     23     12
    1     20     17
    2     24     16
    3     25     19
    

    说明:

    根据每个组中的相对位置与groupby cumcount创建一个新索引:

    df.groupby('Group').cumcount()
    
    Group  new_index
        A          0
        A          1
        A          2
        A          3
        B          0
        B          1
        B          2
        B          3
    

    那么Group就可以成为宽格式Frame中的新列了。

    df.pivot_table(index=df.groupby('Group').cumcount(),
                       columns='Group',
                       values='Miles')
    
    Group   A   B
    0      23  12
    1      20  17
    2      24  16
    3      25  19
    

    然后使用add_prefix + rename_axis 进行一些清理:

    df.pivot_table(index=df.groupby('Group').cumcount(),
                   columns='Group',
                   values='Miles')
        .add_prefix('Col_')
        .rename_axis(columns=None)
    
       Col_A  Col_B
    0     23     12
    1     20     17
    2     24     16
    3     25     19
    

    【讨论】:

    • 我总是怀念我们可以直接通过系列的事实!! :P
    • 它确实在这些情况下简化了事情@Nk03
    猜你喜欢
    • 2018-05-18
    • 2020-12-06
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2023-03-08
    相关资源
    最近更新 更多