首页 > 解决方案 > 有没有办法在不使用循环的情况下对 Pandas 数据框中单个列的多个子集进行分组?

问题描述

有没有一种聪明的方法可以避免遍历我的子集以便在同一列上创建不同的分组?要求这样做是为了以后有助于并行性。

import pandas as pd
types = ['a','a','a','b','b','c','c','c','c','c','d']
values = [1,2,1,3,1,4,5,6,7,9,10]
day = [1,1,2,1,2,1,1,2,3,2]

df = pd.DataFrame(zip(types,values,day),columns=['t','v','d'])

type_subsets = [['a','b'],
               ['a'],
               ['b','c','d']]

for s in type_subsets:
  df_subset = df[df['t'].isin(s)]
  print(s)
  print(df_subset.groupby('d')['v'].sum())

这目前有一个输出,但我想知道是否有办法在单个数据框中表示它?

['a', 'b']
d
1    6
2    2
Name: v, dtype: int64
['a']
d
1    3
2    1
Name: v, dtype: int64
['b', 'c', 'd']
d
1    12
2    16
3     7
Name: v, dtype: int64

标签: pythonpandasdataframe

解决方案


你可以做:

pd.DataFrame(type_subsets).apply(
    lambda row:
    df[df.t.isin(row)].groupby('d')['v'].sum(),
    axis=1))

这会给你:

d     1     2    3
0   6.0   2.0  NaN
1   3.0   1.0  NaN
2  12.0  16.0  7.0

你有for 循环62第一个输出:这些在第一行。您的第二个输出3&1位于第二行。您的最后一个输出:12, 16, 7: 我的最后一行。

所以我们“表示”相同的数据,没有for循环。


正在发生的事情的细分:

pd.DataFrame(type_subsets)是:

   0     1     2
0  a     b  None
1  a  None  None
2  b     c     d

apply(,axis=1)我们将函数应用于每一行。为了避免必须单独定义函数,我们使用 lambda 函数。lambda row:,所以输入是每一行。然后:df[df.t.isin(row)].groupby('d')['v'].sum()。这与您在 for 循环中执行的操作相同。


推荐阅读