【问题标题】:How do I convert upgrouped Data to Grouped Data in Pandas如何将向上分组的数据转换为 Pandas 中的分组数据
【发布时间】:2018-02-20 12:32:34
【问题描述】:

所以我有一个关于商店顾客和该商店每天销售额的数据集。

看起来像这样 -

Store ID     Sales      Customers
1           250        500
2           276        786
3           124        256
5           164        925

如何将其转换为分组数据,类似这样的

Sales           Customers
0-100           0
100-200         1181
200-300         1286

我搜索了一段时间,从 pandas 网站找到了这个 - http://pandas.pydata.org/pandas-docs/version/0.15.2/groupby.html

df2.groupby(['X'], sort=True).sum()

但我无法理解如何将其应用于我的示例。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    将cut 用于垃圾箱,然后使用groupby 并聚合sum:

    df = df.groupby(pd.cut(df['Sales'], [0,100,200,300]))['Customers'].sum().fillna(0)
    print (df)
    Sales
    (0, 100]         0.0
    (100, 200]    1181.0
    (200, 300]    1286.0
    Name: Customers, dtype: float64
    

    也可以定义标签:

    l =['0-100','100-200','200-300']
    b = [0,100,200,300]
    df = df.groupby(pd.cut(df['Sales'], bins=b, labels=l))['Customers'].sum()
           .fillna(0)    
           .reset_index()
    print (df)
         Sales  Customers
    0    0-100        0.0
    1  100-200     1181.0
    2  200-300     1286.0
    

    【讨论】:

      【解决方案2】:

      将pd.cut 与自定义垃圾箱一起使用

      In [2058]: df.groupby(pd.cut(df.Sales, [0, 100, 200, 300])).Customers.sum().fillna(0)
      Out[2058]:
      Sales
      (0, 100]         0.0
      (100, 200]    1181.0
      (200, 300]    1286.0
      Name: Customers, dtype: float64
      

      和reset_index()一起重塑

      In [2061]: (df.groupby(pd.cut(df.Sales, [0, 100, 200, 300])).Customers.sum()
                    .fillna(0).reset_index())
      Out[2061]:
              Sales  Customers
      0    (0, 100]        0.0
      1  (100, 200]     1181.0
      2  (200, 300]     1286.0
      

      并且,使用 labels 自定义名称

      In [2062]: (df.groupby(pd.cut(df.Sales, 
                     bins=[0, 100, 200, 300], 
                     labels=['0-100', '100-200', '200-300']))
               .Customers.sum().fillna(0).reset_index())
      Out[2062]:
           Sales  Customers
      0    0-100        0.0
      1  100-200     1181.0
      2  200-300     1286.0
      

      【讨论】:

        【解决方案3】:

        np.searchsorted

        labels = {0: '0-100', 1: '100-200', 2: '200-300'}
        s = np.searchsorted([100, 200], df.Sales)
        df.groupby(s).Customers.sum().reindex(
            pd.Index([0, 1, 2], name='Sales'), fill_value=0
        ).rename(labels).reset_index()
        
             Sales  Customers
        0    0-100          0
        1  100-200       1181
        2  200-300       1286
        

        【讨论】:

        • 我能问点什么吗?我将您的解决方案用于计时,但输出似乎是错误的here。而且我不知道出了什么问题。可以查一下吗?
        • 您的函数不接受参数。因此data 总是相同的。将此用于stmt 参数:'{}(df)'.format(j)。并将data 放在您定义的每个函数的签名中。 dropna(data) 和 notnull(data) 和 query(data)
        猜你喜欢
        • 2019-03-08
        • 2021-11-18
        • 2016-03-31
        • 2021-05-02
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 2012-04-03
        • 2014-03-23
        相关资源
        最近更新 更多