繁体   English   中英

按字母排序数据框python,然后按年份排序

[英]sorting dataframe python by alphabets then by year

我正在尝试首先按字母顺序对以下数据框进行排序,在该字母顺序内,我希望日期(mmddyear)按时间顺序排列。 即我有这个数据框:

0 A11 01011997 
1 C11 07202005    
2 A12 02011997    
3 B12 12102001    
4 A13 10012000    
5 B11 11012001
6 A00 01101980

我想将其排序为以下形式:

A11 01011997
A00 01101980    
A12 02011997    
A13 10012000    
B11 11012001    
B12 12102001    
C11 07202005

这是我在python中使用的数据框。

sales = [('account', ['A11', 'C11', 'A12','B12','A13','B11']),
       ('date', [1011997, 7202005,2011997,12102001,10012000,11012001])
     ]
df = pd.DataFrame.from_items(sales)

我尝试了sales = sales.sort_values(by=['account']) ,然后按字母顺序对所有内容进行排序。 当我应用sales = sales.sort_values(by=['date']) ,一切都变得sales = sales.sort_values(by=['date'])了。

有什么建议么?

您需要使用df.sort_values(['account', 'date'])对两个字段进行排序。

但是,当日期以字符串或整数表示时,您不能仅对数据框进行排序,因为在许多情况下,您会得到错误的顺序,例如,整数1011997在1021980之前排序,尽管后者在1980年表示日期。类似地, '01011997'各种各样的前'01021980'

因此,首先将日期转换为datetime 在这里,我假定date列包含字符串,因为您的示例数据表明了这一点。

import pandas as pd

sales = [('account', ['A11', 'A11', 'C11', 'A12','B12','A13','B11']),
         ('date', ['01011997', '01021980', '07202005', '02011997', '12102001', '10012000', '11012001'])]
df = pd.DataFrame.from_items(sales)

>>> df.sort_values(['account', 'date'])
  account      date
0     A11  01011997
1     A11  01021980
3     A12  02011997
5     A13  10012000
6     B11  11012001
4     B12  12102001
2     C11  07202005

在这种情况下,第1行应排在第0行之前,但这不是因为列是按字典顺序排序的。 要修复将df['date']转换为dtype datetime64排序:

>>> df['date'] = pd.to_datetime(df['date'], format='%m%d%Y')
>>> df
  account       date
0     A11 1997-01-01
1     A11 1980-01-02
2     C11 2005-07-20
3     A12 1997-02-01
4     B12 2001-12-10
5     A13 2000-10-01
6     B11 2001-11-01

>>> df.sort_values(['account', 'date'])
  account       date
1     A11 1980-01-02
0     A11 1997-01-01
3     A12 1997-02-01
5     A13 2000-10-01
6     B11 2001-11-01
4     B12 2001-12-10
2     C11 2005-07-20

看起来是正确的。

这应该做到这一点:

df.sort_values(['account', 'date'])

您需要同时使用科目和日期对值进行排序。 因此,将它们放在一个列表对象中,并使用它们对数据框进行排序。

您可以创建一个使日期值可排序的函数,然后在对数据帧进行排序时在数据框中创建一个临时列,如下所示:

码:

def date_val(date):
    """ make a sortable date from out format """
    monthday, year = divmod(date, 10000)
    return year * 10000 + monthday

# create a sorted data frame using a temp column
df_sorted = df.assign(sortval=df.date.apply(date_val)) \
    .sort_values(['account', 'sortval']).drop('sortval', 1)

测试代码:

import pandas as pd

sales = [('account', ['A11', 'C11', 'A12', 'B12', 'A13', 'B11']),
         ('date', [1011997, 7202005, 2011997, 12102001, 10012000, 11012001])
         ]
df = pd.DataFrame.from_items(sales)

print(df.assign(sortval=df.date.apply(date_val))
    .sort_values(['account', 'sortval']).drop('sortval', 1))

结果:

  account      date
0     A11   1011997
2     A12   2011997
4     A13  10012000
5     B11  11012001
3     B12  12102001
1     C11   7202005

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM