Pandas 系列:
2004-01-01 0
2004-01-02 0
2004-01-03 0
2004-01-04 0
2004-01-05 1
2004-01-06 0
2004-01-07 0
2004-01-08 3
2004-01-09 0
2004-01-10 2
2004-01-11 0
我想高效地添加一列,用于计算实际行和数字大于 0 的下一行之间的行数。
在这种情况下,它将是:
2004-01-01 0 3
2004-01-02 0 2
2004-01-03 0 1
2004-01-04 0 0
2004-01-05 1 2
2004-01-06 0 1
2004-01-07 0 0
2004-01-08 3 1
2004-01-09 0 0
2004-01-10 2 ...
2004-01-11 0 ...
新列的第一个数字是 3,因为该行与下一行之间有 3 行,第一列上的值与 0 不同,依此类推。
有什么有效的方法吗?
最佳答案
用途:
df['B'] = df.groupby(df.A.gt(0).cumsum()).cumcount(ascending=False)
print (df)
A B
2004-01-01 0 3
2004-01-02 0 2
2004-01-03 0 1
2004-01-04 0 0
2004-01-05 1 2
2004-01-06 0 1
2004-01-07 0 0
2004-01-08 3 1
2004-01-09 0 0
2004-01-10 2 1
2004-01-11 0 0
说明:
第一个比较列 gt
>
bool 掩码:
print (df.A.gt(0))
2004-01-01 False
2004-01-02 False
2004-01-03 False
2004-01-04 False
2004-01-05 True
2004-01-06 False
2004-01-07 False
2004-01-08 True
2004-01-09 False
2004-01-10 True
2004-01-11 False
Name: A, dtype: bool
然后使用 Series.cumsum
对于累积总和
:
print (df.A.gt(0).cumsum())
2004-01-01 0
2004-01-02 0
2004-01-03 0
2004-01-04 0
2004-01-05 1
2004-01-06 1
2004-01-07 1
2004-01-08 2
2004-01-09 2
2004-01-10 3
2004-01-11 3
Name: A, dtype: int32
上次使用GroupBy.cumcount
使用 ascending=False
表示计数器中的降序排列:
print (df.groupby(df.A.gt(0).cumsum()).cumcount(ascending=False))
2004-01-01 3
2004-01-02 2
2004-01-03 1
2004-01-04 0
2004-01-05 2
2004-01-06 1
2004-01-07 0
2004-01-08 1
2004-01-09 0
2004-01-10 1
2004-01-11 0
dtype: int64
关于python - Pandas 系列 - 计算列值之间的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54517731/