Python Pandas 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。
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

结果图:


2413903-44363a04b1c2da2b.png
sort_1

2. 解决方法 2

  1. 通过 Series.apply() 将数据转成我们需要绝对值,并将得到的数值替换成 df.index;
  2. 通过 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

结果图:


2413903-a43cfd2bc6ba15cf.png
sort_2

3. 解决方法 3

  1. 使用 Series.map() 得到自定义排序后的参数;
  2. 使用 numpy.argsort() 得到排序后的位置;
  3. 利用步骤 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

结果图:


2413903-512e71e17ab922b2.png
sort_3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值