忽略特定值对 Pandas DataFrame 进行排序

5

有一个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),
})

按值排序后,结果如下(按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

然而,我想基于大于0.5的值进行排序。这将忽略colA中的较小值,并切换到colB进行进一步排序。

排序后的DataFrame如下所示(row 23被交换):

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

非常感谢您的帮助!
3个回答

3

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

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

Detail:

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

这个方法可以轻松地扩展到大型数据框,非常简洁。我现在学会了 where。我使用了 idx = df.where(df > 0.5).sort_values(list(df.columns), ascending=False).index 然后 df = df.loc[idx, :] 来将其应用于任意大小的数据框。 - Nico

1
构建一个新列,与“a”相同,但忽略较小的值,并使用此新值和“b”进行排序:
df.assign(simplified_a = np.where(df.colA<0.5, 0, df.colA))\
  .sort_values(["simplified_a", "colB"], ascending=False).drop("simplified_a", axis=1)

结果:

   colA  colB
0  0.97  0.01
1  0.88  0.03
3  0.02  0.99
2  0.03  0.87

0

根据条件过滤数据框,然后排序,最后追加。

df1 = df.where(df['colA'] > 0.5).sort_values('colA')
df2 = df.where(df['colA'] <= 0.5).sort_values('colB')

final_frame = df1.append(df2).dropna()

   colA  colB
0  0.87  0.01
1  0.88  0.03
2  0.03  0.87
3  0.02  0.99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接