排序熊猫数据框矢量化方式

时间:2018-11-30 11:12:13

标签: python pandas vectorization

样本输入数据框如下

df_input = pd.DataFrame([[1,2,3,4,5], [2,1,4,7,6], [5,6,3,7,np.nan], [np.nan,np.nan,np.nan,np.nan]], columns=["A", "B","C","D","E"])

预期输出

df_output=pd.DataFrame([[-1,-1,0,1,1],[-1,-1,0,1,1],[-1,1,-1,1,0],[0,0,0,0,0]],columns=["A", "B","C","D","E"])

这就是我正在尝试的。
1)对每一行进行排序。

2)将-1分配给最小的有效观测值,将+1分配给最大的有效观测值。

3)NaN必须为零。

4)如果列数为奇数,则中位数必须为零。

以下代码适用于偶数列。

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

如何将其扩展为奇数列并说明NaN。 预先感谢。

2 个答案:

答案 0 :(得分:3)

我相信您需要numpy.select

a = df_input.rank(axis=1)
x = df_input.shape[1] / 2

m1 = a < x
m2 = a > x
m3 = (a.eq(a.mean(axis=1), axis=0))

df = pd.DataFrame(np.select([m3, m2, m1], [0, 1, -1], 0), columns=df_input.columns)
print (df)
   A  B  C  D  E
0 -1 -1  0  1  1
1 -1 -1  0  1  1
2 -1  1 -1  1  0
3  0  0  0  0  0

答案 1 :(得分:-1)

您似乎在为NAN('NAN')使用字符串。

然后:

df_input = pd.DataFrame([[1,2,3,4,5], [2,1,4,7,6], [5,6,3,7,np.nan], [np.nan,np.nan,np.nan,np.nan]], columns=["A", "B","C","D","E"])

    df_input
        A   B   C   D   E
0   1.0 2.0 3.0 4.0 5.0
1   2.0 1.0 4.0 7.0 6.0
2   5.0 6.0 3.0 7.0 NaN
3   NaN NaN NaN NaN NaN

df2 = df_input.copy()
df2[:] = np.where(df2.isna(), 0, np.where(df2.rank(axis=1) > df2.shape[1] / 2, 1, -1))

df2

        A   B   C   D   E
0   -1  -1  1   1   1
1   -1  -1  1   1   1
2   -1  1   -1  1   0
3   0   0   0   0   0