对 pandas DataFrame 进行排序,忽略某些值

Nic*_*ico 5 python dataframe pandas

有一个 pandas DataFrame,其值接近 1 和接近 0:

df = pd.DataFrame({
'colA': (0.97, 0.88, 0.03, 0.02),
'colB': (0.01, 0.03, 0.87, 0.99),
})
Run Code Online (Sandbox Code Playgroud)

根据值对其进行排序给出(排序colB显然没有效果):

df.sort_values(['colA','colB'], ascending=False)
>>    colA  colB
>> 0  0.97  0.01
>> 1  0.88  0.03
>> 2  0.03  0.87
>> 3  0.02  0.99
Run Code Online (Sandbox Code Playgroud)

但是,我想仅根据较大的值进行排序,例如> 0.5。这将忽略较小的值colA并切换到colB进一步排序。

排序后的 DataFrame 看起来像这样(row 2并且3被切换):

df.some_function(['colA','colB'], ascending=False, condition=i>0.5)
>>    colA  colB
>> 0  0.97  0.01
>> 1  0.88  0.03
>> 2  0.02  0.99
>> 3  0.03  0.87
Run Code Online (Sandbox Code Playgroud)

非常感谢你的帮助!

jez*_*ael 3

想法是将不匹配的值替换为缺失值,然后排序,最后按新索引更改顺序:

idx = (df[['colA','colB']].where(df[['colA','colB']] > 0.5)
           .sort_values(['colA','colB'], ascending=False).index)

df1 = df.loc[idx]
print (df1)
   colA  colB
0  0.97  0.01
1  0.88  0.03
3  0.02  0.99
2  0.03  0.87
Run Code Online (Sandbox Code Playgroud)

细节

print (df[['colA','colB']].where(df[['colA','colB']] > 0.5))
   colA  colB
0  0.97   NaN
1  0.88   NaN
2   NaN  0.87
3   NaN  0.99


print (df[['colA','colB']].where(df[['colA','colB']] > 0.5)
                          .sort_values(['colA','colB'], ascending=False))
   colA  colB
0  0.97   NaN
1  0.88   NaN
3   NaN  0.99
2   NaN  0.87
Run Code Online (Sandbox Code Playgroud)