Как циклически переключать NaN в строках данных панд? - PullRequest
1 голос
/ 18 мая 2019

У меня есть такой фрейм данных:

df = pd.DataFrame({0: list('wxyz'), 1: [1,2,None,None], 2: [10,20,30,None]}).T
print(df)

    0   1    2    3
0   w   x    y    z
1   1   2  NaN  NaN
2  10  20   30  NaN

Как разместить все NA слева, а не справа?

Обязательно:

    0   1    2    3
0   w   x    y    z
1  NaN  NaN  1    2
2  NaN  10  20   30

1 Ответ

3 голосов
/ 18 мая 2019

Есть смешанные числа со строками строк, поэтому решение заключается в использовании sorted с параметром key в DataFrame.apply:

df = df.apply(lambda x: pd.Series(sorted(x, key=pd.notna)), axis=1)
#alternative
#df = df.apply(lambda x: sorted(x, key=pd.notna), axis=1, result_type='expand')
print (df)

     0    1   2   3
0    w    x   y   z
1  NaN  NaN   1   2
2  NaN   10  20  30

Если все значения являются числовыми, более быстрое решение будет с justify :

df = pd.DataFrame({1: [1,2,None,None], 2: [10,20,30,None]}).T
print(df)
      0     1     2   3
1   1.0   2.0   NaN NaN
2  10.0  20.0  30.0 NaN

arr = justify(df.values, invalid_val=np.nan, side='right')
df = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df)
    0     1     2     3
1 NaN   NaN   1.0   2.0
2 NaN  10.0  20.0  30.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...