我有一个 Dataframe :
Out[78]:
contract month year buys adjusted_lots price
0 W Z 5 Sell -5 554.85
1 C Z 5 Sell -3 424.50
2 C Z 5 Sell -2 424.00
3 C Z 5 Sell -2 423.75
4 C Z 5 Sell -3 423.50
5 C Z 5 Sell -2 425.50
6 C Z 5 Sell -3 425.25
7 C Z 5 Sell -2 426.00
8 C Z 5 Sell -2 426.75
9 CC U 5 Buy 5 3328.00
10 SB V 5 Buy 5 11.65
11 SB V 5 Buy 5 11.64
12 SB V 5 Buy 2 11.60
我需要一个总和adjusted_lots,价格是加权平均值,价格和adjusted_lots,由所有其他列分组,即分组(合同,月,年和购买)
R上类似的解决方案可以通过下面的代码实现,使用dplyr,但是不能在Pandas上做同样的事情。
> newdf = df %>%
select ( contract , month , year , buys , adjusted_lots , price ) %>%
group_by( contract , month , year , buys) %>%
summarise(qty = sum( adjusted_lots) , avgpx = weighted.mean(x = price , w = adjusted_lots) , comdty = "Comdty" )
> newdf
Source: local data frame [4 x 6]
contract month year comdty qty avgpx
1 C Z 5 Comdty -19 424.8289
2 CC U 5 Comdty 5 3328.0000
3 SB V 5 Comdty 12 11.6375
4 W Z 5 Comdty -5 554.8500
通过groupby或任何其他解决方案是否也可以实现相同的效果?
8条答案
按热度按时间a6b3iqyw1#
**编辑:**更新聚合,使其适用于最新版本的panda
要将多个函数传递给groupby对象,需要传递一个元组以及聚合函数和该函数所应用的列:
您可以在这里看到更多:
在这个类似的问题中
[1]网址:https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.25.0.html#groupby-aggregation-with-relabeling
bksxznpy2#
用groupby(...).apply(...)进行加权平均可能会非常慢(比下面慢100倍),请参见我的答案(以及其他答案)。
5hcedyr03#
这样做不是简单得多吗。
1.将(adjusted_lots * price_weighted_mean)乘以新列“X”
1.使用groupby().sum()对列“X”和“adjusted_lots”进行分组df_grouped
1.将df_grouped的加权平均值计算为df_grouped ['X']/df_grouped ['adjusted_lots']
zdwk9cvp4#
使用dict聚合函数的解决方案将在panda的未来版本(0.22版)中弃用:
使用groupby apply并返回Series来重命名列,如中所述:Rename result columns from Pandas aggregation ("FutureWarning: using a dict with renaming is deprecated")
会产生同样的结果:
irlmq6kh5#
使用
datar
,您不必学习panda API来转换R代码:我是软件包的作者。如果您有任何问题,请随时提交问题。
gab6jxml6#
ErnestScribbler的答案比公认的答案要快得多。下面是一个多元类比:
oxalkeyp7#
当我遇到类似的问题时,我遇到了这个线程。在我的情况下,我想生成一个四分卫评级的加权指标,如果不止一个四分卫在给定的NFL比赛中尝试传球。
如果在扩展时遇到重大的性能问题,我可能会更改代码。目前,我更喜欢将解决方案与其他转换一起压缩到
.agg
函数中。很高兴看到有人有更简单的解决方案来实现相同的目的。最终,我采用了闭包模式。闭包方法的神奇之处在于,如果这对未来的读者来说是一种不熟悉的模式,我仍然可以向panda的
.agg()
方法返回一个简单的函数,但是我可以使用从顶层factory
函数预先配置的一些附加信息来完成。下面是形状为(5436,31)的DataFrame上的一些基本基准测试统计数据,在此阶段,就性能而言,这些统计数据在我看来并不重要:
x4shl7ld8#
这将original approach by jrjc和closure approach by MB结合在一起,其优点是能够重用闭包函数。