首页 > 解决方案 > df.apply(lambda x: x.value_counts()) 的矢量化版本

问题描述

我有一个包含大量时间序列余额的数据框。它看起来像

      Run1    Run2    Run3    ...    Run10000
2018  100     100     100              100
2019 101.2   99.2    101.0    ...     101.6
...
2038 142.2   151.3   102.7    ...     173.0

本质上,我想查看有多少试验运行低于某个数字,例如起始余额的 90%。

目前我正在做

((portfolio_values < starting_value*0.9).apply(lambda x: x.value_counts()).loc[True] > 0).value_counts().loc[True]

抱歉,一个班轮非常糟糕,但想法是它根据表中的值是否低于起始值的 90% 创建一个掩码,然后它会通过并计算 True 和 False 值。然后它检查哪些列有一些非零数量的 True 值(意思是,它确实下降到 90% 以下),然后计算这些值中有多少是真实的。

问题是这真的很慢,而且我确信 Pandas 有某种功能可以完全满足我的需求,就像它通常那样。

提前致谢!

标签: python-3.xpandas

解决方案


你可以使用:

(portfolio_values < starting_values*.9).any().sum()

any对于在列中至少满足一次条件的每一列返回 True,然后使用 sum 来计算列或在您的情况下“运行”。


推荐阅读