【问题标题】:How to merge rows and convert them into columns如何合并行并将它们转换为列
【发布时间】:2016-11-21 06:54:44
【问题描述】:

我有一个如下的数据框:

ID  START   END  SEQ
1   11      12   1
1   14      15   3 
1   13      14   2
2   10      14   1
3   11      15   1
3   16      17   2

我需要把它转换成这个DataFrame:

ID  START_1  END_1  SEQ_1  START_2  END_2  SEQ_2 START_3  END_3  SEQ_3
1   11       12     1      13       14     2     14       15     3 
2   10       14     1      NA       NA     NA    NA       NA     NA   
3   11       15     1      16       17     2     NA       NA     NA 

问题是ID相同的行数是先验未知的,这意味着不应该手动定义最大列数START_XEND_XSEQ_X。 考虑到列应按SEQ 排序,是否有任何自动化方法可以进行此转换? 我应该使用group_by 还是应该使用哪种方法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将groupbyunstack 一起使用,然后使用sort_index,最后从list comprehension 的列中删除MultiIndex

    df['SEQ1'] = df.SEQ
    df = df.groupby(['ID','SEQ1']).mean().unstack()
    df = df.sort_index(axis=1, level=1)
    df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns]
    print (df)
        START_1  END_1  SEQ_1  START_2  END_2  SEQ_2  START_3  END_3  SEQ_3
    ID                                                                     
    1      11.0   12.0    1.0     13.0   14.0    2.0     14.0   15.0    3.0
    2      10.0   14.0    1.0      NaN    NaN    NaN      NaN    NaN    NaN
    3      11.0   15.0    1.0     16.0   17.0    2.0      NaN    NaN    NaN
    

    默认情况下使用pivot_tableaggfunc='mean' 的另一种解决方案是:

    df['SEQ1'] = df.SEQ
    df = df.pivot_table(index= ['ID','SEQ1']).unstack()
    df = df.sort_index(axis=1, level=1)
    df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns]
    print (df)
        END_1  SEQ_1  START_1  END_2  SEQ_2  START_2  END_3  SEQ_3  START_3
    ID                                                                     
    1    12.0    1.0     11.0   14.0    2.0     13.0   15.0    3.0     14.0
    2    14.0    1.0     10.0    NaN    NaN      NaN    NaN    NaN      NaN
    3    15.0    1.0     11.0   17.0    2.0     16.0    NaN    NaN      NaN
    

    【讨论】:

    • 一个问题,@jezrael。此代码在标题下方生成额外的行并将ID 放在该行中,而其他标题在第一行中。有可能解决吗?其实我开了个新帖,希望大家帮忙(stackoverflow.com/questions/40723561/…)
    猜你喜欢
    • 2019-09-20
    • 2016-01-05
    • 2021-07-17
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多