我试图按字母顺序排列以下数据框,并按字母顺序排列,我希望日期(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'])
时,一切都会变得无序。
有什么建议吗?
答案 0 :(得分:1)
您需要使用df.sort_values(['account', 'date'])
对这两个字段进行排序。
但是,当日期表示为字符串或整数时,您不能对数据框进行排序,因为在许多情况下,您将得到错误的顺序,例如整数1011997在1021980之前排序,尽管后者代表1980年的日期。同样'01011997'
在'01021980'
之前排序。
首先将日期转换为datetime
。在这里,我假设日期列包含字符串,因为您的示例数据表明了这一点。
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
看起来是正确的。
答案 1 :(得分:0)
您可以创建一个使日期值可排序的函数,然后在对数据框进行排序时在数据框中创建一个临时列:
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
答案 2 :(得分:-1)
这应该这样做:
df.sort_values(['account', 'date'])
您需要同时使用帐户和日期对值进行排序。因此将它们放在一个列表对象中并使用它们对数据帧进行排序。