场景:对 DataFrame 中数字列绝对值进行排序。
pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
结构图为:
1. 解决方法 1
- 生成一个名为『temp_sort』临时的列,使用 abs() 将数值绝对值化;
- 对 DataFrame.sort_values() 对列 temp_sort 进行排序;
- 删除临时列 temp_sort。
df = pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
df['temp_sort'] = abs(df['digital'])
new_df = df.sort_values(by=['temp_sort']).drop(columns=['temp_sort'])
new_df
结果图:
2. 解决方法 2
- 通过 Series.apply() 将数据转成我们需要绝对值,并将得到的数值替换成 df.index;
- 通过 sort_index 对 index 排序即可得到我们想到的数据。
df = pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
df.index = df['digital'].apply(abs).tolist()
new_df = df.sort_index()
new_df
结果图:
3. 解决方法 3
- 使用 Series.map() 得到自定义排序后的参数;
- 使用 numpy.argsort() 得到排序后的位置;
- 利用步骤 2 中得到的数值 ,并使用 DataFrame.reindex() 根据 index 的位置从新排序。
df = pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
sort_ser = df['digital'].map(lambda x: abs(x))
re_index = np.argsort(sort_ser)
new_df = df.reindex(re_index.values.tolist())
new_df
结果图: