python - 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但它与我感兴趣的绘图有关。有什么线索吗?
解决方案
您可以使用 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
推荐阅读
- azure-language-understanding - LUIS 短语列表可互换是什么意思?
- uwp - 如何只允许一个 UWP App 实例?
- laravel - 如何在 laravel 的数据库条目中查找重复项
- android - 如何正确初始化光标?
- javascript - 数据进入材料表时如何调用UseEffect?
- youtube-api - 如何检索保留待审核的 YouTube 评论
- wso2 - 使用 wso2 api manager 访问受 oauth 保护的端点
- sql - ORA-01722- 无效号码
- node.js - crypto.getCurves 未定义
- r - 多次按组生成随机序列号