Python 基于一列中的特定值在数据帧中查找时间增量

Python 基于一列中的特定值在数据帧中查找时间增量,python,pandas,group-by,pandas-groupby,crosstab,Python,Pandas,Group By,Pandas Groupby,Crosstab,我有一个数据框,希望在其中计算唯一资产保持安装的天数(timedelta)。示例输入数据帧如下所示 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','r

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

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交叉表

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

然而,我不知道如何从这里开始。不知何故,我们需要折叠层次索引,从一个日期到下一个日期进行细分


非常感谢任何指导。

假设每个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
哪个输出:

阿尔弗努姆资产 安装 远离的 安装时间 A-2007 2017-11-15 00:00:00 纳特 纳特 A-3534 2012-03-02 00:00:00 2013-04-01 00:00:00 395天00:00:00 A-3724 2007-11-01 00:00:00 2012-03-02 00:00:00 1583天00:00:00 A2732 2013-04-01 00:00:00 2017-11-15 00:00:00 1689天00:00:00
创建两个已安装的列,并使用“应用”命令删除。然后使用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','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

太棒了,谢谢你。我假设传递aggfunc=max意味着在同一id上存在重复安装/删除的情况下取最大值?max将取安装和删除的最大(即最新)日期,因此,如果您在其中安装了多个安装/删除,则只会给您安装最新安装的时间。好的,谢谢。它对我的实际df不起作用。事实上,我有多个安装日期和多个删除日期,如果你有多个安装和删除相同的id,你会得到一些奇数,但不是偶数。您的安装时间最终将为负值。如果您想要总安装时间,请参考前面的问题: