【问题标题】:Calculating only the current and previous rows in a Pandas data series仅计算 Pandas 数据系列中的当前行和上一行
【发布时间】:2018-12-24 13:08:10
【问题描述】:

python 新手。我确信有一个非常简单的解决方案,但我很难找到它。

我有一系列正数和负数。我想知道正数的百分比。我已经为整个数据集完成了这项工作,但我希望在每一行上都进行计算。

我正在使用的数据集非常大,但这里是一个示例:

import pandas as pd

data = {'numbers': [100, 300, 150, -150, -75, -100]}

df = pd.DataFrame(data)

df['count'] = df['numbers'].count()
df['pct_positive'] = df.numbers[df.numbers > 0].count() / df['count']

print(df)

这是实际结果:

   numbers  count  pct_positive
0      100      6           0.5
1      300      6           0.5
2      150      6           0.5
3     -150      6           0.5
4      -75      6           0.5
5     -100      6           0.5

这是我想要的结果:

   numbers  count  pct_positive
0      100      1           1.0
1      300      2           1.0
2      150      3           1.0
3     -150      4           0.75
4      -75      5           0.66
5     -100      6           0.5

注意 'count' 和 'pct_positive' 是如何在所需结果的每一行上计算的,它们只是实际结果中的总计。

【问题讨论】:

  • 你能解释一下pct_positive正负数计算背后的逻辑吗?

标签: python pandas


【解决方案1】:

在这种情况下,'Count' 对您的索引来说是多余的,因此您可以根据索引创建该列(或者只使用索引)。 .cumsum 一个布尔值Series 检查> 0 以获得除以'Count' 后的正百分比。

df['Count'] = df.index+1
df['pct_pos'] = df.numbers.gt(0).cumsum()/df.Count

   numbers  Count  pct_pos
0      100      1     1.00
1      300      2     1.00
2      150      3     1.00
3     -150      4     0.75
4      -75      5     0.60
5     -100      6     0.50

另外,避免将列命名为'count',因为它是一种方法。

【讨论】:

  • 这正是我所需要的。太感谢了!并且,感谢您对计数列的警告。感谢您的宝贵时间。
【解决方案2】:

试试:

df.numbers.gt(0).cumsum().div(df.numbers.notnull().cumsum())

输出:

0    1.00
1    1.00
2    1.00
3    0.75
4    0.60
5    0.50
Name: numbers, dtype: float64

详情:

  • 获取 df.number 的符号检查是否大于 0 为正 然后 cumsum 该列。
  • 使用 notnull 计算数字以更改为布尔值和 cumsum。
  • 将正数除以总数。

【讨论】:

  • 优秀。感谢您的加入,斯科特。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多