仅计算熊猫数据系列中的当前行和上一行

时间:2018-12-24 04:49:40

标签: python pandas

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',它们只是实际结果的总和。

2 个答案:

答案 0 :(得分: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',因为这是一种方法。

答案 1 :(得分:1)

尝试:

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 然后累加该列。
  • 使用notnull计数为boolean和cumsum来计数数字。
  • 按总数划分正数。