Создать новый DataFrame без значений NaN - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующий Dataframe:

     a    b    c    d    e
0  NaN  2.0  NaN  4.0  5.0
1  NaN  2.0  3.0  NaN  5.0
2  1.0  NaN  3.0  4.0  NaN
3  1.0  2.0  NaN  4.0  NaN
4  NaN  2.0  NaN  4.0  5.0

Я пытаюсь сгенерировать новый Dataframe без значений NaN. В строке всегда одинаковое количество значений NaN.

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

   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5

Кто-нибудь знает простой способ сделать это? Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Использование индексации массива:

pd.DataFrame(df.values[df.notnull().values].reshape(df.shape[0],3),
             columns=list('xyz'),dtype=int)

    x   y   z
0   2   4   5
1   2   3   5
2   1   3   4
3   1   2   4
4   2   4   5

Если dataframe имеет больше значений несоответствия в рядах, например, в 1-й строке с 4 значениями и из 2-й строки, если в ней 3 значения, то это будет сделано:

    a   b   c   d   e   g
0   NaN 2.0 NaN 4.0 5.0 6.0
1   NaN 2.0 3.0 NaN 5.0 NaN
2   1.0 NaN 3.0 4.0 NaN NaN
3   1.0 2.0 NaN 4.0 NaN NaN
4   NaN 2.0 NaN 4.0 5.0 NaN

pd.DataFrame(df.apply(lambda x: x.values[x.notnull()],axis=1).tolist())

    0   1   2   3
0   2.0 4.0 5.0 6.0
1   2.0 3.0 5.0 NaN
2   1.0 3.0 4.0 NaN
3   1.0 2.0 4.0 NaN
4   2.0 4.0 5.0 NaN

Здесь мы не можем удалить NaN's в последнем столбце.

0 голосов
/ 31 августа 2018

Если, как в вашем примере, значения увеличиваются по столбцам, вы можете сортировать по axis=1:

res = pd.DataFrame(np.sort(df.values, 1)[:, :3],
                   columns=list('xyz'), dtype=int)

print(res)

   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5
0 голосов
/ 31 августа 2018

Используйте функцию justify и выберите первые 3 столбца:

df = pd.DataFrame(justify(df.values,invalid_val=np.nan)[:, :3].astype(int),
                  columns=list('xyz'), 
                  index=df.index)
print (df)
   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...