我正在处理类似于下面示例的数据框:
import pandas as pd
import numpy as np
np.random.seed(0)
np.random.seed(0)
df = pd.DataFrame({'date' : np.tile(['2024-05-01', '2024-06-01'], 4),
'State' : np.repeat(['fl', 'ny', 'mi', 'nc'], 2),
'Rev' : [21000, 18200, 51200, 48732, 5676, 6798, 24012, 25005],
'Score' : np.random.normal(size = 8),
'Value' : np.random.randint(10, 50, size = 8)})
df
date State Rev Score Value
0 2024-05-01 fl 21000 1.764052 34
1 2024-06-01 fl 18200 0.400157 22
2 2024-05-01 ny 51200 0.978738 11
3 2024-06-01 ny 48732 2.240893 48
4 2024-05-01 mi 5676 1.867558 49
5 2024-06-01 mi 6798 -0.977278 33
6 2024-05-01 nc 24012 0.950088 34
7 2024-06-01 nc 25005 -0.151357 27
预期输出应该是
dataframe
按
Rev
排序,从最大到最小,并且在每个
State
中,
date
列应该从in排序升序。
尝试了下面的代码:
(df.sort_values(by = ['Rev'], ascending = [False]).
groupby('State', as_index = False).
apply(lambda x : x.sort_values('date')).reset_index(drop = True))
但它没有给我所需的输出。
date State Rev Score Value
0 2024-05-01 fl 21000 1.764052345967664 34
1 2024-06-01 fl 18200 0.4001572083672233 22
2 2024-05-01 mi 5676 1.8675579901499675 49
3 2024-06-01 mi 6798 -0.977277879876411 33
4 2024-05-01 nc 24012 0.9500884175255894 34
5 2024-06-01 nc 25005 -0.1513572082976979 27
6 2024-05-01 ny 51200 0.9787379841057392 11
7 2024-06-01 ny 48732 2.240893199201458 48
输出应该是 NY、NC、FL 和 MI,根据
Rev
和
date
列按该顺序。
即对于
State
组,
Rev
的
2024-05-01
值将决定哪个状态在最终输出顺序中优先。
有人可以帮助我编写代码吗?
可以通过使用
sort_values
对数据框进行两次排序来实现这一点,一次是对“Rev”进行降序排序,一次是对“date”进行升序排序:
df_sorted = df.sort_values(['Rev', 'date'], ascending=[False, True])
print(df_sorted)
这将产生以下输出:
date State Rev Score Value
2 2024-05-01 ny 51200 0.978738 11
3 2024-06-01 ny 48732 2.240893 48
6 2024-05-01 nc 24012 0.950088 34
7 2024-06-01 nc 25005 -0.151357 27
0 2024-05-01 fl 21000 1.764052 34
1 2024-06-01 fl 18200 0.400157 22
4 2024-05-01 mi 5676 1.867558 49
5 2024-06-01 mi 6798 -0.977278 33
在这个代码中:
-
sort_values(['Rev', 'date'], ascending=[False, True])
执行主要的排序操作。-
['Rev', 'date']
指定用于排序的列。 -
ascending=[False, True]
定义排序顺序。Rev
按降序排序(False
),而date
在每个Rev
组内按升序排序(True
)。
-
此方法确保根据
Rev
对数据框进行排序,并且在每个
State
组中,
date
按照时间顺序排列。
如果希望按照
Rev
的
2024-05-01
值对状态进行排序,则需要首先创建一个辅助列或系列,然后使用它来对数据框进行排序。以下是执行此操作的方法:
df['Rev_20240501'] = df.loc[df['date'] == '2024-05-01'].groupby('State')['Rev'].transform('first')
df_sorted = df.sort_values(['Rev_20240501', 'State', 'date'], ascending=[False, True, True]).drop('Rev_20240501', axis=1)
print(df_sorted)
这将提供所需的输出,其中各州按
Rev
的
2024-05-01
值排序,日期按每个州排序:
date State Rev Score Value
2 2024-05-01 ny 51200 0.978738 11
3 2024-06-01 ny 48732 2.240893 48
6 2024-05-01 nc 24012 0.950088 34
7 2024-06-01 nc 25005 -0.151357 27
0 2024-05-01 fl 21000 1.764052 34
1 2024-06-01 fl 18200 0.400157 22
4 2024-05-01 mi 5676 1.867558 49
5 2024-06-01 mi 6798 -0.977278 33
在本方法中:
-
我们使用
df.loc[df['date'] == '2024-05-01']
创建了一个数据框子集,其中date
为 '2024-05-01'`。 -
然后,我们使用
groupby('State')
对这个子集进行分组,并使用transform('first')
为每个状态获取Rev
的第一个(并且应该是唯一的,因为每个日期-状态组合只有一行)值。这将创建一个名为Rev_20240501
的新列,其中包含每个状态的2024-05-01
的相应Rev
值。 -
最后,我们根据
Rev_20240501
、State
和date
对数据框进行排序,并在排序后删除辅助列Rev_20240501
。