当前位置: 代码迷 >> python >> 如何使用python拆分数据框来创建组
  详细解决方案

如何使用python拆分数据框来创建组

热度:56   发布时间:2023-06-27 21:31:51.0

我的数据框:

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

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

 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。在group1group2group3的合计值(A + B + C = 4)(即保持量的最大谷作为4)。 group4我们可以看到没有要添加的值,因此该组由剩余的部分组成(这里是2)。 group2group3您可以看到E和F的值被除。

因此,将来我可以按名称或编号选择组。

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

这可能在python中吗? 如果是的话,请给我建议方法。 我可以练习和学习。

您的数据:

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

然后分组和求和。

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()。

希望对您有所帮助。

我应该解释一下解决方案吗? 对你起作用吗?

@ 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