python - 以列为地平线的 Pandas 数据透视表

标签 python pandas pivot-table

我有一个像这样的数据框:

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/

相关文章:

python - 列表对象没有属性列

python - 不规则时间序列上的 Pandas 滑动/滚动窗口

python - 如何将html切片成数据框

python - 我想使用 discord.py 制作一个多页帮助命令

Python Pandas ExcelWriter 附加到工作表创建一个新工作表

Python 线程 - 多线程崩溃

java - XSSF (POI) - 将 "formula"列添加到数据透视表

python - 过滤数据透视表列中的值

python - Pandas - 透视多个分类列

c# - 在 Epplus (C#) 中创建没有基表的数据透视表