【问题标题】:How do I find the difference between columns, but only for the next non-zero value in pandas?如何找到列之间的差异,但仅限于 pandas 中的下一个非零值?
【发布时间】:2021-02-09 22:08:23
【问题描述】:

我有一个包含几百万行的DataFrame,每一行都类似于以下内容:

2017-06-13         NaT         NaT         NaT         NaT         NaT         NaT  2017-10-28
2017-10-02         NaT         NaT         NaT         NaT         NaT         NaT  2017-10-28
2017-10-30  2017-10-31         NaT  2017-10-31  2017-11-01  2017-11-02  2017-11-03  2017-11-03
2017-10-30  2017-10-30         NaT  2017-10-30         NaT  2017-10-30  2017-11-01  2017-11-01
2017-10-02         NaT         NaT         NaT         NaT         NaT         NaT  2017-10-28

每一列都是一个过程中的一个步骤,我试图找出从一个步骤到另一个步骤所需的时间。 NaT 值表示已跳过该步骤,因此我想在计算中跳过它并计算下一个(非 NaT)步骤的时间。

在此示例中,对于第一行和第二行,我正在寻找最后一列和第一列之间的差异。对于第三行,我正在寻找第一列和第二列、第四列和第二列、第五列和第四列等之间的差异。预期的输出类似于以下内容(如果我们使用天数):

NaT   0     0     0     0     0     0   137
NaT   0     0     0     0     0     0   111
NaT   1     0     0     1     1     1     0
NaT   0     0     0     0     0     2     0
NaT   0     0     0     0     0     0    26 

我确信有一种方法可以使用 for 循环和 if 语句并减去日期,但我希望有一种更加矢量化的方法,因为 DataFrame 相当大。

【问题讨论】:

  • 请不要发布您的数据图片,而是实际可复制的数据,例如您对预期输出所做的操作。以这种方式很难重现您的问题并找到解决方案。

标签: python pandas


【解决方案1】:

好吧,我冒昧地创建了一个工作示例。请不要分享您的数据图片,因为需要重新创建 MRE(最小可重现示例)并有助于更快地回答您的问题。

import numpy as np
import pandas as pd
from datetime import date, datetime

dic = {
    "col1": [datetime(2020, 1, 1), datetime(2020,2,1), datetime(2020,3,1), datetime(2020,4,1)],
    "col2": [datetime(2020, 1, 4), np.nan, datetime(2020,3,5), datetime(2020,4,2)],
    "col3": [np.nan, np.nan, np.nan, datetime(2020,4,4)],
    "col4": [datetime(2020, 1, 6), datetime(2020,2,10), datetime(2020,3,6), datetime(2020,4,5)],
}

df.ffill(axis=1, inplace=True)
df = df - df.shift(axis=1)
df

这会导致:

    col1    col2    col3    col4
0   NaT 3 days  0 days  2 days
1   NaT 0 days  0 days  9 days
2   NaT 4 days  0 days  1 days
3   NaT 1 days  2 days  1 days

解释:ffill(axis=1)确保每行带有 NaN(或 NaT)的行都填充了之前的有效值。然后我们从原始数据中减去一个移位的数据帧来计算两者之间的天数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多