有没有一种方法可以在不使用循环的情况下通过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

你可以做:

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&CCD_ 4在第二行中。您的最后一个输出:12167:我的最后一行。

所以我们"表示";相同的数据,而没有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循环中执行的操作相同。

最新更新