df.apply的向量化版本(lambda x:x.value_counts())

时间:2018-07-11 18:33:03

标签: python-3.x pandas

我有一个数据框,其中有一些时间序列平衡。看起来像

      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%),然后计算出其中有多少是True。

问题在于这真的很慢,而且我确定Pandas具有某种功能,可以正常执行我所要查找的功能。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用:

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

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

答案 1 :(得分:0)

尝试一下:

mask_df = df < starting_value*0.9
result = mask_df.any()

我在虚拟示例中的控制台中对其进行了测试,它似乎可以正常工作。