python数据透视表 - 列是日期,应该正确排序
Posted
技术标签:
【中文标题】python数据透视表 - 列是日期,应该正确排序【英文标题】:python pivot table - columns are dates and should be sorted correctly 【发布时间】:2018-05-02 15:45:52 【问题描述】:我在以下数据框中的目标是计算给定月份在特定位置售出的汽车数量。您会注意到数据透视结果是正确的,但列(日期)不一致。不一致的原因是因为我将月份汇总为一个字符串(如果汽车在 10 月 9 日和 10 月 10 日售出,那么我将 2 算作 10 月)。
问题:我应该如何设计应用的 get_date,这样数据透视表才能正确排序日期?或者,有没有更好的方法来解决这个问题以获得预期的结果。
表格
数据透视表结果:
数据框:
df = pd.DataFrame("LOCATION":["USA","USA","USA","USA","JAPAN","JAPAN"],"CAR":["BMW","BMW","TOYOTA","FORD","BMW","FORD"],"SALE_DATE":pd.to_datetime(["2017-10-09","2017-09-28","2017-10-09","2017-10-12","2017-09-30","2017-09-30"]))
apply date_str_date(按月汇总):
def get_date_str(row):
doi = row["SALE_DATE"]
doi_str = "".join(doi.strftime('%B-%y'))
return doi_str
枢轴:
df.pivot_table(values="CAR", index="LOCATION", columns='SALE_DATE', aggfunc='count')
【问题讨论】:
试试df.SALE_DATE = pd.to_datetime(df.SALE_DATE).dt.month
,然后从那里开始。
如果您想要字符串中的月份名称,另请参阅this question。
月份,因为字符串是一个“对象”,所以它会按字母顺序排列。我会得到同样的结果。另一种方法是应用一种将所有月份调整为月初的方法(即 17 年 10 月 4 日变为 17 年 10 月 1 日),然后围绕 columbs="first_of_month" 旋转。 df.SALE_DATE = pd.to_datetime(df.SALE_DATE).dt.month 给出一个数字(9 月为 9。我也需要年份)。谢谢
所以首先根据月份作为数字进行旋转,排序,然后转换为字符串,不是吗?
好的。 (因为我对python很陌生)列将是一个字符串,不是吗?所以我必须用 df.rename(columns=0:["SEP...
【参考方案1】:
您可以执行以下操作:
首先,从日期中提取月份:
df.SALE_DATE = pd.to_datetime(df.SALE_DATE).dt.month
现在转:
df = df.pivot_table(values="CAR", index="LOCATION", columns='SALE_DATE', aggfunc='count').fillna(0)
按日期排序: df = df.reindex_axis(sorted(df.columns), axis=1)
将它们转换成字符串:
months = 1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May',
6: 'Jun', 7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'
df.columns = [months[c] for c in df.columns]
>>> df
Sep Oct
LOCATION
JAPAN 2.0 0.0
USA 1.0 3.0
【讨论】:
我们穿越了。再次感谢!以上是关于python数据透视表 - 列是日期,应该正确排序的主要内容,如果未能解决你的问题,请参考以下文章