【问题标题】:count cumulative number of rows since a condition is et in a Pandas DataFrame计算自在 Pandas DataFrame 中设置条件以来的累积行数
【发布时间】:2015-05-18 10:27:20
【问题描述】:

我有一个 pandas DF,它有两列,Day 和 Data,从 csv 文件中读取。

阅读后,我添加了 3 列“条件为 0 的天数”、1 和 2。例如,对于“条件为 2 的天数”列,我这样做:

DF['Days with condition 2'] = ''
DF['Days with condition 2'][DF['Data']==2]=1 

我需要做但无法弄清楚的是如何计算“自条件以来的天数”0、1、2。例如,“自条件 2 以来的天数”应在索引 19 中显示 11,因为这是自上次触发条件(索引 8)以来的行数。是否有任何 pandas 功能可以做到这一点?

【问题讨论】:

  • 在您的示例中,索引 8 处的“自条件天数”中的值是多少? 1 个?
  • 在 NA 之前应该是 0
  • 对不起,我的问题措辞不佳。你希望它是什么?

标签: python pandas


【解决方案1】:

从您的两个原始列开始

   Day  Data
0     1     1
1     2     0
2     3     0
3     4     0
4     5     0
5     6     0
6     7     1
7     8     0
8     9     2
9    10     0
10   11     0
11   12     1
12   13     0
13   14     0
14   15     0
15   16     1
16   17     0
17   18     1
18   19     0
19   20     2
20   21     0
21   22     0
22   23     0

以下是填充“条件 2 的天数”的方法。使用布尔索引过滤 2s。然后我们使用 shift() 减去前一天。

接下来的几个步骤过滤第一次出现的 2 并更新“条件为 2 的天数”等于天,但它可以是您想要的任何值

然后是一个 fillna() 来摆脱 NaN。您要添加的其他两列可以使用相同的模式

filter = (df["Data"] == 2) 
df.loc[filter,"Days with condition 2"] =  df[filter]["Day"] - df[filter]["Day"].shift(1)
filter = filter & (df["Days with condition 2"].isnull())
df.loc[filter,"Days with condition 2"] =  df[filter]["Day"]
df = df.fillna(0)
df
    Day  Data  Days with condition 2
0     1     1                      0
1     2     0                      0
2     3     0                      0
3     4     0                      0
4     5     0                      0
5     6     0                      0
6     7     1                      0
7     8     0                      0
8     9     2                      9
9    10     0                      0
10   11     0                      0
11   12     1                      0
12   13     0                      0
13   14     0                      0
14   15     0                      0
15   16     1                      0
16   17     0                      0
17   18     1                      0
18   19     0                      0
19   20     2                     11
20   21     0                      0
21   22     0                      0
22   23     0                      0

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2013-02-24
    • 2019-08-10
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多