Python 熊猫-如何对格式为字符串的周数和年数进行排序?
我有一个像这样的熊猫数据框,排序如下:Python 熊猫-如何对格式为字符串的周数和年数进行排序?,python,pandas,dataframe,sorting,data-analysis,Python,Pandas,Dataframe,Sorting,Data Analysis,我有一个像这样的熊猫数据框,排序如下: >>> weekly_count.sort_values(by='date_in_weeks', inplace=True) >>> weekly_count.loc[:9,:] date_in_weeks count 0 1-2013 362 1 1-2014 378 2 1-2015 201 3 1-2016 294 4 1-2017 300
>>> weekly_count.sort_values(by='date_in_weeks', inplace=True)
>>> weekly_count.loc[:9,:]
date_in_weeks count
0 1-2013 362
1 1-2014 378
2 1-2015 201
3 1-2016 294
4 1-2017 300
5 1-2018 297
6 10-2013 329
7 10-2014 314
8 10-2015 324
9 10-2016 322
在上面的数据的第一列中,所有以周为单位的日期行都是“一年中的周数”。我现在想把它分类如下:
date_in_weeks count
0 1-2013 362
6 10-2013 329
1 1-2014 378
7 10-2014 314
2 1-2015 201
8 10-2015 324
3 1-2016 294
9 10-2016 322
4 1-2017 300
5 1-2018 297
如何执行此操作?您可以尝试使用辅助列:
import pandas as pd
df = pd.DataFrame({'date_in_weeks':['1-2013','1-2014','1-2015','10-2013','10-2014'],
'count':[362,378,201,329,314]})
df['aux'] = df['date_in_weeks'].str.split('-')
df['aux_2'] = df['aux'].str.get(1).astype(int)
df['aux'] = df['aux'].str.get(0).astype(int)
df = df.sort_values(['aux_2','aux'],ascending=True)
df = df.drop(columns=['aux','aux_2'])
print(df)
输出:
date_in_weeks count
0 1-2013 362
3 10-2013 329
1 1-2014 378
4 10-2014 314
2 1-2015 201
您还可以转换为datetime,分配给df,然后对值进行排序并删除额外的列:
s = pd.to_datetime(df['date_in_weeks'],format='%M-%Y')
final = df.assign(dt=s).sort_values(['dt','count']).drop('dt',1)
使用转换为日期时间的格式
%W
年度周数:
欢迎来到SO。这不是一个讨论论坛或教程。请花点时间阅读和阅读该页面上的其他链接。花些时间学习教程和文档,练习示例。它会让你了解解决问题所需的工具。第一步:告诉给你这些数据的人使用ISO8601。很好的Anky,我试过做
pd.to_datetime()
,但一定是因为失败而错过了格式化。@CeliusStingher是的,格式化参数在这种情况下很有帮助:)@Anky_91-yop,也不确定几分钟是否是一周中的好选择
print(final)
date_in_weeks count
0 1-2013 362
6 10-2013 329
1 1-2014 378
7 10-2014 314
2 1-2015 201
8 10-2015 324
3 1-2016 294
9 10-2016 322
4 1-2017 300
5 1-2018 297
df = df.iloc[pd.to_datetime(df['date_in_weeks'] + '-0',format='%W-%Y-%w').argsort()]
print (df)
date_in_weeks count
0 1-2013 362
6 10-2013 329
1 1-2014 378
7 10-2014 314
2 1-2015 201
8 10-2015 324
3 1-2016 294
9 10-2016 322
4 1-2017 300
5 1-2018 297