有没有一种聪明的方法可以避免在我的子集中循环,以便在同一列上创建不同的分组?这样做是为了以后有助于并行性。
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循环的第一个输出中有6
和2
:它们在这里的第一行。您的第二个输出3
&CCD_ 4在第二行中。您的最后一个输出: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循环中执行的操作相同。