python - 有没有办法在不使用循环的情况下对 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 循环6
的2
第一个输出:这些在第一行。您的第二个输出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 循环中执行的操作相同。
推荐阅读
- python - 如何在 python 中生成三个月日期?
- cookies - 根据 GDPR cookie 法,是否需要在数据库中存储用户偏好?
- python - 根据条件使用 ffill 和 bfill
- sqlite - 在 sqlite3 中更改当前目录
- jquery - 根据第一个和第二个菜单选择填充第三个下拉菜单
- python - python, 练习, for 循环
- android - 如何在颤动中显示本机视图?
- javascript - JavaScript:“$”不是函数错误
- html - aria- describeby - 两个字段的描述相同?
- android - 预期 BEGIN_OBJECT 但在 Kotlin 中使用 Gson 是 BEGIN_ARRAY”