afi*_*nit 24 python sorting dataframe pandas
我正在寻找一种简单的方法来按特定列的绝对值对pandas数据帧进行排序,但不会实际更改数据帧中的值.类似的东西sorted(df, key=abs).所以,如果我有一个数据帧,如:
a b
0 1 -3
1 2 5
2 3 -1
3 4 2
4 5 -9
Run Code Online (Sandbox Code Playgroud)
在"b"上排序时得到的排序数据如下所示:
a b
2 3 -1
3 4 2
0 1 -3
1 2 5
4 5 -9
Run Code Online (Sandbox Code Playgroud)
EdC*_*ica 34
UPDATE
自从并且 已被弃用(感谢@Ruggero Turra),您现在可以使用它来实现:0.17.0 ordersortsort_values
In[16]:
df.reindex(df.b.abs().sort_values().index)
Out[16]:
a b
2 3 -1
3 4 2
0 1 -3
1 2 5
4 5 -9
Run Code Online (Sandbox Code Playgroud)
Luc*_*pkn 19
在函数中使用参数keysort_values():
import pandas as pd
ttt = pd.DataFrame({'A': ['a', 'b', 'c', 'd', 'e', 'f'], 'B': [-3, -2, -1, 0, 1, 2]})
ttt.sort_values(by='B', key=abs)
Run Code Online (Sandbox Code Playgroud)
将产生:
A B
3 d 0
2 c -1
4 e 1
1 b -2
5 f 2
0 a -3
Run Code Online (Sandbox Code Playgroud)
argsort一种更干净的方法是调用Series.argsort绝对值,然后索引:
df.iloc[df['b'].abs().argsort()]
a b
2 3 -1
3 4 2
0 1 -3
1 2 5
4 5 -9
Run Code Online (Sandbox Code Playgroud)
如果您需要重置索引,请使用Series.reset_index,
df.iloc[df['b'].abs().argsort()].reset_index(drop=True)
a b
0 3 -1
1 4 2
2 1 -3
3 2 5
4 5 -9
Run Code Online (Sandbox Code Playgroud)
最后,由于argsort没有ascending参数指定升序/降序,因此您需要取反df['b'].abs()以按降序排序。
df.iloc[(-df['b'].abs()).argsort()]
a b
4 5 -9
1 2 5
0 1 -3
3 4 2
2 3 -1
Run Code Online (Sandbox Code Playgroud)
您也可以使用NumPy做到这一点-使用np.abs和ndarray.argsort。
df.iloc[np.abs(df['b'].values).argsort()]
a b
2 3 -1
3 4 2
0 1 -3
1 2 5
4 5 -9
Run Code Online (Sandbox Code Playgroud)
或者,对于降序,
df.iloc[(-np.abs(df['b'].values)).argsort()]
a b
4 5 -9
1 2 5
0 1 -3
3 4 2
2 3 -1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16398 次 |
| 最近记录: |