【问题标题】:Finding a timedelta in pandas dataframe based upon specific values in one column根据一列中的特定值在 pandas 数据框中查找 timedelta
【发布时间】:2021-05-15 16:55:02
【问题描述】:

我有一个数据框,我希望在其中计算唯一资产保持安装的天数(时间增量)。示例输入数据帧如下

df =pd.DataFrame({'Date': ['2007-11-01','2012-03-02','2012-03-02','2013-04-01','2013-04-01','2017-11-15','2017-11-15'], 'action':['installed','installed','removed','installed','removed','installed','removed'], 'asset_alphnum':['A-3724','A-3534','A-3724','A2732','A-3534','A-2007','A2732']})

输出:

我已经尝试过 pd.crosstab

pd.crosstab(df.asset_alphnum, [df.Date, df.action])

输出

但是我不知道如何从这里获取它。不知何故需要折叠分层索引并从下一个日期减去一个日期。

非常感谢任何指导。

【问题讨论】:

    标签: python pandas group-by pandas-groupby crosstab


    【解决方案1】:

    假设您对每个 ID 只有一个安装日期和一个删除日期,您可以使用数据透视表,对日期值使用 max(或 min 或任何其他聚合函数)。

    df["Date"] = pd.to_datetime(df["Date"])  # Converting strings to datetimes
    df = df.pivot_table(index="asset_alphnum", columns="action", values="Date", aggfunc=max)  # max is just an example, most aggfuncs will work if there's only ever one date
    df["time_installed"] = df["removed"] - df["installed"]  # timedelta column
    

    哪个输出这个:

    asset_alphnum installed removed time_installed
    A-2007 2017-11-15 00:00:00 NaT NaT
    A-3534 2012-03-02 00:00:00 2013-04-01 00:00:00 395 days 00:00:00
    A-3724 2007-11-01 00:00:00 2012-03-02 00:00:00 1583 days 00:00:00
    A2732 2013-04-01 00:00:00 2017-11-15 00:00:00 1689 days 00:00:00

    【讨论】:

    • 太棒了,谢谢。我假设传递 aggfunc=max 意味着在相同 id 存在重复安装/删除的情况下取最大值?
    • max 将采用最大(即最新)的安装和删除日期,因此如果您在其中安装/删除了多个,它只会为您提供最新安装的安装时间。
    • 好的,谢谢。它对我的实际 df 不起作用。实际上,对于任何 ID,我都有多个安装和多个删除日期
    • 如果您对同一个 id 进行多次安装和删除,您会得到一些奇数,但不是每个的偶数。你最终会在 time_installed 中得到一个负值。
    • 如果你想要总安装时间,你应该参考你之前的问题:stackoverflow.com/questions/62521934
    【解决方案2】:

    使用应用创建安装和删除的两列。然后使用数据框交叉表计算频率

    date=['2007-11-01', '2012-03-02', '2012-03-02',
    '2013-04-01', '2013-04-01', '2017-11-15', '2017-11-15']
    action=['installed', 'installed', 'removed', 'installed','removed','installed','removed']
    asset_alphnum=['A-3724','A3534','A-3724','A2732','A-3534','A-2007','A2732']
    
    df=pd.DataFrame({'date':date, 'action':action,'asset_alphnum':asset_alphnum})
    df.set_index('date')
    df['installed']=df['action'].apply(lambda x: 1 if x=='installed' else 0)
    df['removed']=df['action'].apply(lambda x: 1 if x=='removed' else 0)
    df.drop('action',axis=1)
    print(df)
    print(pd.crosstab(df.asset_alphnum, [df.date]))
    output:
    date           2007-11-01  2012-03-02  2013-04-01  2017-11-15
    asset_alphnum                                                
    A-2007                  0           0           0               1
    A-3534                  0           0           1           0
    A-3724                  1           1           0           0
    A2732                   0           0           1           1
    A3534                   0           1           0           0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 2017-04-04
      • 2019-05-04
      相关资源
      最近更新 更多