【问题标题】:pandas groupby transpose str columnpandas groupby 转置 str 列
【发布时间】:2018-10-06 16:12:50
【问题描述】:

这是我想要做的:

>>>import pandas as pd
>>>dftemp = pd.DataFrame({'a': [1] * 3 + [2] * 3, 'b': 'a a b c d e'.split()})
    a   b
0   1   a
1   1   a
2   1   b
3   2   c
4   2   d
5   2   e
6   3   f

如何转置按列“a”分组的列“b”,以便输出如下所示:

    a   b0 b1  b2
0   1   a  a   b
3   2   c  d   e
6   3   f  NaN NaN

【问题讨论】:

  • a 中的每个值恰好出现 3 次?
  • 不可以变化..也许插入空值

标签: python pandas dataframe pivot transpose


【解决方案1】:

pivot_tablecumcount 一起使用:

(df.assign(flag=df.groupby('a').b.cumcount())
    .pivot_table(index='a', columns='flag', values='b', aggfunc='first')
    .add_prefix('B'))

flag B0   B1   B2
a
1     a    a    b
2     c    d    e
3     f  NaN  NaN

【讨论】:

    【解决方案2】:

    您可以尝试按列分组并将与组关联的值展平并将其重新构建为数据框

    df = df.groupby(['a'])['b'].apply(lambda x: x.values.flatten())
    pd.DataFrame(df.values.tolist(),index=df.index).add_prefix('B')
    

    输出:

        B0  B1  B2
    a           
    1   a   a   b
    2   c   d   e
    3   f   None    None
    

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

      >>> dftemp = pd.DataFrame({'a': [1] * 3 + [2] * 2 + [3]*1, 'b': 'a a b c d e'.split()})
      >>> dftemp
         a  b
      0  1  a
      1  1  a
      2  1  b
      3  2  c
      4  2  d
      5  3  e
      >>> dftemp.groupby('a')['b'].apply(lambda df: df.reset_index(drop=True)).unstack()
         0     1     2
      a
      1  a     a     b
      2  c     d  None
      3  e  None  None
      

      【讨论】:

        【解决方案4】:

        根据您的DataFrame 的顺序,您可以找到组更改的位置并使用np.split 创建一个新的DataFrame

        import numpy as np
        import pandas as pd
        
        splits = dftemp[(dftemp.a != dftemp.a.shift())].index.values
        
        df = pd.DataFrame(np.split(dftemp.b.values, splits[1:])).add_prefix('b').fillna(np.NaN)
        df['a'] = dftemp.loc[splits, 'a'].values
        

        输出

          b0   b1   b2  a
        0  a    a    b  1
        1  c    d    e  2
        2  f  NaN  NaN  3
        

        【讨论】:

          猜你喜欢
          • 2017-01-12
          • 1970-01-01
          • 1970-01-01
          • 2016-06-07
          • 2021-02-24
          • 2017-04-06
          • 2020-09-23
          • 1970-01-01
          • 2016-10-01
          相关资源
          最近更新 更多