Python 在Pandas中按多列排序,但使用';na#u位置';第二类

Python 在Pandas中按多列排序,但使用';na#u位置';第二类,python,pandas,sorting,Python,Pandas,Sorting,我有一个像这样的数据框 df = pd.DataFrame( { 'OrderID': ['o1','o2','o3','o4','o5'], 'CustomerID': ['c1','c1','c2','c2','c3'], 'CustomerRating': [5,1,3, NaN,NaN] } ) 我想先按CustomerID排序,然后按CustomerRating排序,这样客户评级中的NaN排在最后。我知道df.sort\u值(na\u position

我有一个像这样的数据框

df = pd.DataFrame(
 {
   'OrderID': ['o1','o2','o3','o4','o5'],
   'CustomerID': ['c1','c1','c2','c2','c3'],
   'CustomerRating': [5,1,3, NaN,NaN]
    
 }
)
我想先按CustomerID排序,然后按CustomerRating排序,这样客户评级中的NaN排在最后。我知道df.sort\u值(na\u position='last'),但这只适用于主排序。如何使其适用于第二类

就像我将升序参数指定为一个列表,其中每个元素对应一个排序级别,我需要类似的na_位置参数, 比如说:

df.sort_values(['CustomerID', 'CustomerRating', ascending = [False, False], na_position =['last', 'last']]
我该怎么做


感谢文档中的,您必须
为多个排序顺序指定列表。我的解释是,排序顺序必须符合逻辑。此外,您不能指定na_位置以对应没有“NaN”的列

 print(df.sort_values(['CustomerID', 'CustomerRating'], ascending = [False, False], na_position ='first'))#Here, NaN is first because `c3` and `c2` appear on top



  OrderID CustomerID  CustomerRating
4      o5         c3             NaN
3      o4         c2             NaN
2      o3         c2             3.0
0      o1         c1             5.0
1      o2         c1             1.0

print(df.sort_values(['CustomerID', 'CustomerRating'], ascending = [True, True], na_position ='last'))# This is reversed again because the sort is logical



   OrderID CustomerID  CustomerRating
1      o2         c1             1.0
0      o1         c1             5.0
2      o3         c2             3.0
3      o4         c2             NaN
4      o5         c3             NaN

print(df.sort_values(['CustomerID', 'CustomerRating'], ascending = [False, True], na_position ='first'))



  OrderID CustomerID  CustomerRating
4      o5         c3             NaN
3      o4         c2             NaN
2      o3         c2             3.0
1      o2         c1             1.0
0      o1         c1             5.0

下面的代码将根据每行中存在的空值计数对行进行排序

df.iloc[df.isnull().sum(axis=1).mul(1).argsort()]
替代解决方案

下面的代码将完美地适用于所有测试用例。按OrderID和CustomerID排序的最后一次和同时,空值将始终存在

null_df=df[df.isnull().any(axis=1)]
all_df=df[~df.index.isin(null_df.index)]

all_df.sort_values(['OrderID', 'CustomerID'], ascending = [True, True], inplace=True)
null_df.sort_values(['OrderID', 'CustomerID'], ascending = [True, True], inplace=True)

final_df=pd.concat([all_df, null_df]).reset_index(drop=True)

简单的df.sort_值(['CustomerID','CustomerRating'])

请发布您的预期结果也可以尝试上面提到的链接将帮助您根据空值计数对数据框进行排序,但如果您按标识符列(OrderID和CustomerID)排序,它将重新洗牌。如果排序不重要,这可能是最好的解决方案。它不适用于此-
df=pd.DataFrame({'OrderID':['o1'、'o2'、'o3'、'o4'、'o5']、'CustomerID':['c1'、'c2'、'c2'、'c3']、'CustomerRating':[np.nan、np.nan、3、1、2])
让我们先试试put
CustomerRating
打印(df.sort\u值)(['CustomerRating','CustomerID'],ascending=[False,True],na_position='last'))
仍然可能有可能失败的测试用例。