链接 groupby 并应用 pandas
Chaining groupby and apply pandas
我正在寻找一种方法来链接 groupby 并应用,就像这样(具体示例请参见下面的代码):
df.groupby("a").apply(func_1).groupby("b").apply(func_2)
我猜它不起作用,因为 groupby 需要输入一个数据帧,上面的第二个 groupby 并不总是这样(可以输入一个系列,cf 示例)。
一个解决方案可能是让第一个 apply 输出 func_1 的结果加上原始数据帧,但我还没有找到如何做到这一点。
我正在寻找一个通用的解决方法,而不仅仅是这个特定示例的解决方法。
示例:假设我想为 b 中的每个组计算 a 的路缘下面积,然后计算 c 中每个组的这些面积的总和。
df=pd.DataFrame({"a":np.arange(8),"b":np.repeat(np.arange(4),2),
"c":np.repeat(np.arange(2),4)})
df
a b c
0 0 0 0
1 1 0 0
2 2 1 0
3 3 1 0
4 4 2 1
5 5 2 1
6 6 3 1
7 7 3 1
df.groupby("b").apply(lambda x: trapz(x["a"])).groupby("c").apply(sum)
Traceback (most recent call last):
[...]
KeyError: 'c'
#Expected output
c
0 3.0
1 11.0
#I know that this code works, but I would like to avoid to modify
#my dataframe :
df["result"]=list(df
.groupby("b").apply(lambda x: trapz(x["a"]))
.repeat(df.groupby("b").size()))
df.groupby("b").first().groupby("c").result.sum()
非常感谢任何帮助!
我想我会做这样的事情:
# your_fun is the function you want to apply
df.groupby('c').apply(lambda f: sum(f.groupby('b')['a'].apply(your_fun))
我正在寻找一种方法来链接 groupby 并应用,就像这样(具体示例请参见下面的代码):
df.groupby("a").apply(func_1).groupby("b").apply(func_2)
我猜它不起作用,因为 groupby 需要输入一个数据帧,上面的第二个 groupby 并不总是这样(可以输入一个系列,cf 示例)。 一个解决方案可能是让第一个 apply 输出 func_1 的结果加上原始数据帧,但我还没有找到如何做到这一点。
我正在寻找一个通用的解决方法,而不仅仅是这个特定示例的解决方法。
示例:假设我想为 b 中的每个组计算 a 的路缘下面积,然后计算 c 中每个组的这些面积的总和。
df=pd.DataFrame({"a":np.arange(8),"b":np.repeat(np.arange(4),2),
"c":np.repeat(np.arange(2),4)})
df
a b c
0 0 0 0
1 1 0 0
2 2 1 0
3 3 1 0
4 4 2 1
5 5 2 1
6 6 3 1
7 7 3 1
df.groupby("b").apply(lambda x: trapz(x["a"])).groupby("c").apply(sum)
Traceback (most recent call last):
[...]
KeyError: 'c'
#Expected output
c
0 3.0
1 11.0
#I know that this code works, but I would like to avoid to modify
#my dataframe :
df["result"]=list(df
.groupby("b").apply(lambda x: trapz(x["a"]))
.repeat(df.groupby("b").size()))
df.groupby("b").first().groupby("c").result.sum()
非常感谢任何帮助!
我想我会做这样的事情:
# your_fun is the function you want to apply
df.groupby('c').apply(lambda f: sum(f.groupby('b')['a'].apply(your_fun))