我有一个像这样的数据框:
first_dt dt val
2023-01-01 2023-01-02 1
2023-01-01 2023-01-02 1
2023-01-01 2023-01-03 1
...
2023-01-02 2023-01-03 1
2023-01-02 2023-01-04 1
您应该注意,dt
永远不会小于first_dt
。我想 reshape 为如下所示的pivot_table
first_dt horizon_1 horizon_2 horizon_3
2023-01-01 2 1 0
2023-01-02 1 1 0
最初,我想我会做以下事情
pandas.pivot_table(df, index='first_dt', columns='dt', values='val', aggfunc=np.sum)
但是,当我拥有多年数据且只需要少数范围(例如 3、7 等)时,这种方法就无法很好地扩展。
关于如何在 first_dt
时间内动态计算 dt
有什么想法吗?
最佳答案
将数据转换为日期时间,计算日差(水平线),然后进行透视:
df['first_dt'] = pd.to_datetime(df['first_dt'])
df['dt'] = pd.to_datetime(df['dt'])
(df.assign(horizon=lambda x: x['dt'].sub(x['first_dt']).div(pd.Timedelta('1D')).astype(int))
.query('horizon < 7') # query
.pivot_table(index='first_dt', columns='horizon', values='val', aggfunc='sum')
)
或者与pd.crosstab
类似:
pd.crosstab(
df['first_dt'],
pd.to_datetime(df['dt']).sub(pd.to_datetime(df['first_dt']))
.div(pd.Timedelta('1D')).astype(int)
.loc[lambda x: x<7],
df['val'],
aggfunc='sum'
)
输出:
horizon 1 2
first_dt
2023-01-01 2 1
2023-01-02 1 1
关于python - 以列为地平线的 Pandas 数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76148912/