当前位置:   article > 正文

Python Pandas DataFrame Series 自定义排序

python dataframe跟据指定的series顺序排序

场景:对 DataFrame 中数字列绝对值进行排序。

pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])

结构图为:


2413903-007b9527efe264db.png
sort_0

1. 解决方法 1

  1. 生成一个名为『temp_sort』临时的列,使用 abs() 将数值绝对值化;
  2. 对 DataFrame.sort_values() 对列 temp_sort 进行排序;
  3. 删除临时列 temp_sort。
  1. df = pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
  2. df['temp_sort'] = abs(df['digital'])
  3. new_df = df.sort_values(by=['temp_sort']).drop(columns=['temp_sort'])
  4. new_df

结果图:


2413903-44363a04b1c2da2b.png
sort_1

2. 解决方法 2

  1. 通过 Series.apply() 将数据转成我们需要绝对值,并将得到的数值替换成 df.index;
  2. 通过 sort_index 对 index 排序即可得到我们想到的数据。
  1. df = pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
  2. df.index = df['digital'].apply(abs).tolist()
  3. new_df = df.sort_index()
  4. new_df

结果图:


2413903-a43cfd2bc6ba15cf.png
sort_2

3. 解决方法 3

  1. 使用 Series.map() 得到自定义排序后的参数;
  2. 使用 numpy.argsort() 得到排序后的位置;
  3. 利用步骤 2 中得到的数值 ,并使用 DataFrame.reindex() 根据 index 的位置从新排序。
  1. df = pd.DataFrame([6, -5, 4, -2, 3], columns=['digital'])
  2. sort_ser = df['digital'].map(lambda x: abs(x))
  3. re_index = np.argsort(sort_ser)
  4. new_df = df.reindex(re_index.values.tolist())
  5. new_df

结果图:


2413903-512e71e17ab922b2.png
sort_3
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号