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)
非常感谢你的帮助!
想法是将不匹配的值替换为缺失值,然后排序,最后按新索引更改顺序:
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)