【问题标题】:How do I add a counter column that starts and stops at specific rows in a Pandas DataFrame?如何添加一个在 Pandas DataFrame 中的特定行开始和停止的计数器列?
【发布时间】:2019-07-08 21:35:12
【问题描述】:

我在 Pandas 中有一个现有的 DataFrame,它有一列包含 3 个不同的值(Column1)。我希望能够创建一个列,以便它在每个“开始”处计算每一行,并在下一个“结束”(Column2)处停止计算。做这个的最好方式是什么?我不知道如何解决这个问题,输出是一个严格的要求。

样本输出:

    Column1    Column2
    0          0
    0          0
    0          0
    0          0
    Start      1
    0          2
    0          3
    0          4
    End        5
    0          0
    0          0
    0          0
    Start      1
    0          2
    End        3

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    mask + ffill

    此答案假定 Start 出现在 DataFrame 之前 End 出现,否则填充会被反转。


    col = df['Column1']
    
    m = col.ne('Start') & col.shift().ne('End')
    
    v = col.eq('Start').mask(m).ffill().fillna(0)
    
    v.groupby(v.ne(v.shift()).cumsum()).cumsum()
    

    0     0.0
    1     0.0
    2     0.0
    3     0.0
    4     1.0
    5     2.0
    6     3.0
    7     4.0
    8     5.0
    9     0.0
    10    0.0
    11    0.0
    12    1.0
    13    2.0
    14    3.0
    Name: Column1, dtype: float64
    

    说明

    首先,找出任何不是开始或结束的值

    >>> m
    0      True
    1      True
    2      True
    3      True
    4     False
    5      True
    6      True
    7      True
    8      True
    9     False
    10     True
    11     True
    12    False
    13     True
    14     True
    Name: Column1, dtype: bool
    

    接下来,mask 任何无效值和ffill,这意味着StartEnd 之间的所有值都用1 填充

    >>> v
    0     0.0
    1     0.0
    2     0.0
    3     0.0
    4     1.0
    5     1.0
    6     1.0
    7     1.0
    8     1.0
    9     0.0
    10    0.0
    11    0.0
    12    1.0
    13    1.0
    14    1.0
    Name: Column1, dtype: float64
    

    最后,按连续重复值分组,cumsum

    【讨论】:

    • 这太棒了,谢谢!你认为你可以分解这个让我准确描述发生了什么,以便我能完全理解吗?
    • @jxho 刚刚添加了一些中间结果,以便您查看发生了什么
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多