【问题标题】:Groupby in Reverse反向分组
【发布时间】:2021-01-12 16:01:48
【问题描述】:

我有一个 pandas 数据框,其中包含变量名称、每个变量的值和 count(显示该行的频率):

df = pd.DataFrame({'var':['A', 'B', 'C'], 'value':[10, 20, 30], 'count':[1,2,3]})

var  value  count
A    10     1
B    20     2
C    30     3

我想使用count 得到这样的输出:

var  value
A    10
B    20
B    20
C    30
C    30
C    30

最好的方法是什么?

【问题讨论】:

标签: python pandas dataframe pandas-groupby


【解决方案1】:

你可以使用index.repeat:

i = df.index.repeat(df['count'])
d = df.loc[i, :'value'].reset_index(drop=True)

   var  value
0   A     10
1   B     20
2   B     20
3   C     30
4   C     30
5   C     30

【讨论】:

    【解决方案2】:

    有很多很多方法可以实现这一点。这是我喜欢做的一种厚颜无耻的方法:

    df.transform({
        "count": lambda x: [i for i in range(x)],
        "var": lambda x: x,
        "value": lambda x: x
    }).explode("count").drop("count", axis=1)
    

    【讨论】:

      【解决方案3】:

      使用Series.repeat

      import pandas as pd
      df = pd.DataFrame({'var':['A', 'B', 'C'], 'value':[10, 20, 30], 'count':[1,2,3]})
      new_df = pd.DataFrame()
      
      new_df['var'] = df['var'].repeat(df['count'])
      new_df['value'] = df['value'].repeat(df['count'])
      new_df
      
          var value
      0   A   10
      1   B   20
      1   B   20
      2   C   30
      2   C   30
      2   C   30
      

      【讨论】:

        【解决方案4】:

        repeatreindex 一起用于这个简短的单行:

        df.reindex(df.index.repeat(df['count']))
        

        输出:

          var  value  count
        0   A     10      1
        1   B     20      2
        1   B     20      2
        2   C     30      3
        2   C     30      3
        2   C     30      3
        

        或者去掉'count'列:

        df[['var','value']].reindex(df.index.repeat(df['count']))
        

        df.reindex(df.index.repeat(df['count'])).drop('count', axis=1)
        

        输出:

          var  value
        0   A     10
        1   B     20
        1   B     20
        2   C     30
        2   C     30
        2   C     30
        

        【讨论】:

        • 这实际上是迄今为止最好的答案。它是唯一一个不需要知道其他列的标签。
        • df.reindex(df.index.repeat(df['count'])).iloc[:,:-1].reset_index(drop=True)
        猜你喜欢
        • 1970-01-01
        • 2013-09-23
        • 2019-11-06
        • 1970-01-01
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        相关资源
        最近更新 更多