【问题标题】:Pandas Series - Count rows between column valuesPandas 系列 - 计算列值之间的行数
【发布时间】:2019-02-04 13:58:24
【问题描述】:

熊猫系列:

    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 不同,依此类推。

一种有效的方法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    用途:

    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 > 的列以获得布尔掩码:

    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 累积sum

    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.cumcountascending=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
    

    【讨论】:

    • 这就是我所需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多