我有一个包含几百万行的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相当大。
好吧,我可以自由地创建一个可行的示例。请不要共享您的数据图片,因为期望重新创建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)的每一行都填充有先前的有效值。然后,我们从原始数据中减去移位后的数据框,以计算之间的天数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句