【问题标题】:How to create a group by spliting the dataframe using python如何通过使用 python 拆分数据框来创建组
【发布时间】:2019-02-27 17:02:39
【问题描述】:

我的数据框:

 df:
 order             quantity
  A                   1
  B                   1
  C                   2
  D                   3
  E                   3
  F                   4

我的目标是根据 Quantity 值从此数据框创建一个组。 我想要的结果。

 df:
group        order             quantity
  1             A                   1
                B                   1
                C                   2
  2             D                   3
                E                   1
  3             E                   2
                F                   2
  4             F                   2

所以这里我想要的结果是基于数量的。数量的最大值为 4。 在group1group2 &group3 中,总值(A+B+C=4)(即保持数量的最大值为 4)。 在group4 中,我们可以看到没有要添加的值,所以组是由剩下的(这里是 2)形成的。 在group2&group3可以看到E和F的值是分开的。

所以以后我可以通过组名或编号来选择组。

注意: 我的实际订单(column["order"]) 看起来像这样"PMC11-AA1L1PAVWJJ+Z1" 它是一个字符串。

这在 python 中是否可能。如果是这样,请建议我的方法。我可以练习和学习。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您的数据:

    df = pd.DataFrame({'order':['A', 'B', 'C', 'D', 'E', 'F'],'quantity':[1,1,2,3,3,4]})
    

    解决方案:

    df = pd.DataFrame(np.concatenate(df.apply(lambda x: [x[0]] * x[1], 1).as_matrix()), 
                      columns=['order'])
    df['quantity'] = 1
    df['group'] = sorted(range(0, len(df)/3, 1) * 4)[0:len(df)]
    

    输出:

       order  quantity  group
    0      A         1      0
    1      B         1      0
    2      C         1      0
    3      C         1      0
    4      D         1      1
    5      D         1      1
    6      D         1      1
    7      E         1      1
    8      E         1      2
    9      E         1      2
    10     F         1      2
    11     F         1      2
    12     F         1      3
    13     F         1      3
    

    然后 groupby 和 sum。

    df.groupby(['group', 'order']).sum()
    

    输出:

                 quantity
    group order          
    0     A             1
          B             1
          C             2
    1     D             3
          E             1
    2     E             2
          F             2
    3     F             2
    

    如果你愿意,之后可以使用 reset_index()。

    我希望它有所帮助。

    我应该解释解决方案吗?对你有用吗?

    【讨论】:

    • 谢谢,但我遇到了错误。类型错误:'float' 对象不能解释为整数。 df['group'] = sorted(range(0, len(df)/3, 1) * 4)[0:len(df)]你能告诉我为什么吗?
    • @user10309160 尝试更改此原始文件。 df['group'] = sorted(range(0, int(len(df)/3), 1) * 4)[0:len(df)]
    • 您好,现在显示值错误:int() base 必须 >=2 和 df['quantity]中的值都小于或等于 4@
    • @user10309160 真的很奇怪,我没有错误。试试df['group'] = sorted(range(0, len(df)) * 4)[0:len(df)]
    • 再次type error: unsupported operator types for *: 'range' and 'int'
    【解决方案2】:

    @AnnaIliukovich-Strakovskaia 解决方案很棒。我用纯熊猫重写了它。

    #Generate input dataframe from @AnnaIliukovich-Strakovskaia
    df = pd.DataFrame({'order':['A', 'B', 'C', 'D', 'E', 'F'],'quantity':[1,1,2,3,3,4]})
    #Expand dataframe 
    df_out = df.order.repeat(df.quantity).reset_index(drop=True).to_frame()
    #Create groupings of four records 
    df_out['grp'] = df_out.index // 4
    #Groupby 'grp' and count
    df_out.groupby(['grp','order'])['order'].count().to_frame(name='quantity')
    

    输出:

               quantity
    grp order          
    0   A             1
        B             1
        C             2
    1   D             3
        E             1
    2   E             2
        F             2
    3   F             2
    

    【讨论】:

    • 谢谢,两者都是很好的方法。我知道你这边没有问题。但我的数据有问题,因为我从一个巨大的数据帧中提取了数据。使用您的代码时,我收到了TypeError: cannot cast array data from dtype('0') to dtype('int64') according to the rule 'safe'
    • 我有一个问题,如果我的列 ["order"] 有类似 "PTP31B-AA4M1PGBWWJ" 而不是 A,B 的字符串。上面的代码能用吗?
    • @user10309160 是的,它会的。
    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多