Сортировка панд данных в векторном виде - PullRequest
0 голосов
/ 30 ноября 2018

Пример входного фрейма данных выглядит следующим образом:

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 голосов
/ 30 ноября 2018

Я считаю, что вам нужно 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
0 голосов
/ 30 ноября 2018

Похоже, что вы используете строку для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...