根据一列中的特定值在 pandas 数据框中查找时间增量
Finding a timedelta in pandas dataframe based upon specific values in one column
我有一个数据框,我希望在其中计算唯一资产保持安装状态的天数 (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.crosstab
pd.crosstab(df.asset_alphnum, [df.Date, df.action])
输出
但是我不知道如何从这里获取它。不知何故需要折叠层次索引并从下一个日期中减去一个日期。
非常感谢任何指导。
假设每个 ID 只有一个安装日期和一个删除日期,您可以使用数据透视表 table,通过对日期值使用最大值(或最小值或任何其他聚合函数)来实现.
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
使用应用创建安装和删除两列。然后使用数据框交叉表来计算频率
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
我有一个数据框,我希望在其中计算唯一资产保持安装状态的天数 (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.crosstab
pd.crosstab(df.asset_alphnum, [df.Date, df.action])
输出
但是我不知道如何从这里获取它。不知何故需要折叠层次索引并从下一个日期中减去一个日期。
非常感谢任何指导。
假设每个 ID 只有一个安装日期和一个删除日期,您可以使用数据透视表 table,通过对日期值使用最大值(或最小值或任何其他聚合函数)来实现.
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 |
使用应用创建安装和删除两列。然后使用数据框交叉表来计算频率
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