首页 > 解决方案 > pandas:将列设置为水平轴

问题描述

我有以下包含不同日期的行数据集。

         Id       Date  Quantity
0  122222ST 2020-10-19      -1.0
1  122222ST 2020-10-22     75.0
2  122222ST 2020-10-22    1100.0
3    100128 2020-10-20       5.0

我想为每个 Id 变成一个时间序列,这样每个日期都在这里,如果一个 Id 有多个日期,它们加起来,如果没有,它显示一个 0。一个最小的可重现示例就像这样:

Date        122222ST 100128

2020-10-19  -1.0      0
2020-10-20   0        5
2020-10-21   0        0
2020-10-22   1175     0

到目前为止,我已经能够做到这一点:

#read data
df = pd.read_csv('historical_data2.csv', sep=";")

#remove unwanted column
df = df.drop('NetAmount',axis=1)

#set date to datetime 
df['Date'] = pd.to_datetime(df['Date'])

#get unique Ids and sum quantities per date
df = df.groupby(['Id', 'Date']).agg({'Quantity':'sum'}).reset_index()

#adding all missing dates
df = df.groupby(pd.Grouper(key='Date', freq='D'))

从这一点开始,我被卡住了,因为我找不到将 Id 值设置为水平索引的方法。我看过这个例子Python Pandas: How to set Dataframe Column value as X-axis labels但它与我感兴趣的绘图有关。有什么线索吗?

标签: pythonpandasdataframe

解决方案


您可以使用 pivot_table 来做到这一点:

import pandas as pd
import numpy as np


data={"Id":["122222ST",'122222ST','122222ST','100128'],
        "Date":['2020-10-19','2020-10-22','2020-10-22','2020-10-20'],
        "Quantity": [-1,75,1100,50]}


df = pd.DataFrame(data)
df["Date"]=pd.to_datetime(df["Date"], format="%Y-%m-%d")
new_df= pd.pivot_table(df, values='Quantity', index=['Date'],
                    columns=['Id'], aggfunc=np.sum,fill_value=0)



#for missing days (e.g 2020-10-21)
df_Date=pd.date_range(start=new_df.index.min(), end=new_df.index.max(), freq='d')
new_df=new_df.reindex(df_Date,fill_value=0)


print(new_df)

结果:

Id          100128  122222ST
2020-10-19       0        -1
2020-10-20      50         0
2020-10-21       0         0
2020-10-22       0      1175

推荐阅读