为了账号安全,请及时绑定邮箱和手机立即绑定

按行对熊猫数据框进行排序

按行对熊猫数据框进行排序

繁星淼淼 2021-08-11 23:42:19
示例输入数据框import pandas as pddf_input = pd.DataFrame([[1.7, 0.2], [0.4, 0.93], [0.05, 0.96], [0.97, 0.68]], columns=["A", "B"])此示例有两列,而实际数据框有 10 列。我想按升序对每一行进行排序,然后将 -1 分配给前 5 列,将 +1 分配给接下来的 5 列。示例输出如下:-df_output=pd.DataFrame([[1, -1], [-1, 1], [-1, 1], [1, -1]], columns=["A", "B"])请建议前进的方向。
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

您可以rank,然后通过numpy.where以下方式有条件地分配:


df[:] = np.where(df.rank(axis=1) > df.shape[1] / 2, 1, -1)


print(df)


   A  B

0  1 -1

1 -1  1

2 -1  1

3  1 -1

注意:这假设重复值总是获得相同的等级。


查看完整回答
反对 回复 2021-08-11
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你想要np.argsort:


np.argsort(df_input, axis=1).replace(0, -1)


   A  B

0  1 -1

1 -1  1

2 -1  1

3  1 -1

推广到 N 行:


v = np.where(np.argsort(df_input) >= df.shape[1] // 2, 1, -1)    

df_output =  pd.DataFrame(v)

print(df)

    0   1   2   3   4   5   6   7   8   9

0  49  80  80  27  15  13  52  50  48  69

1  51  24  55  73  81  55  32  67  19  14

2  67   2  29  19  14  89  54  83  22  64

3  24  55  87  94  22  61  74  26  37   8


v = np.where(np.argsort(df_input) >= df.shape[1] // 2, 1, -1)    

df_output =  pd.DataFrame(v)


print(df_output)

   0  1  2  3  4  5  6  7  8  9

0  1 -1 -1  1 -1  1  1  1 -1 -1

1  1  1 -1  1 -1 -1  1  1 -1 -1

2 -1 -1 -1  1 -1  1  1 -1  1  1

3  1 -1 -1  1  1 -1  1  1 -1 -1


查看完整回答
反对 回复 2021-08-11
  • 3 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信