Как извлечь non-nans из pandas DataFrame - PullRequest
0 голосов
/ 06 мая 2020

Я прочитал много сообщений, но до сих пор не могу понять следующее. Как я могу извлечь non-nans из pandas DataFrame? Например:

import pandas as pd
import numpy as np

tmp = pd.DataFrame({'Women': {0: 28, 1: 42, 2: 52, 3: 62},
 'Men': {0: 46.0, 1: 55.0, 2: np.nan, 3: np.nan},
 'Girls': {0: 40.0, 1: np.nan, 2: np.nan, 3: np.nan},
 'Boys': {0: 47.0, 1: 49.0, 2: 35.1, 3: np.nan}}

)

Результатом будет list или dict, выглядящее так:

[[28, 42, 52, 62], [46.0, 55.0], [40.0], [47.0, 49.0, 35.1]]

Я могу сделать это, перебирая столбцы и отбрасывая nans:

x=[]
for col in tmp.columns:
    x.append(list(tmp[col].dropna()))

Но мне было любопытно, есть ли какой-нибудь более приятный способ без for l oop или использования некоторых функций pandas, чтобы сделать его быстрым и приятным. В идеале однострочный, так как это должно быть в более крупной функции, настолько простой, читаемой и короткой, насколько это возможно :). Спасибо

1 Ответ

3 голосов
/ 06 мая 2020

Первая идея с пониманием списка:

L = [[y for y in x if pd.notna(y)] for x in tmp.T.to_numpy()]
print (L)
[[28.0, 42.0, 52.0, 62.0], [46.0, 55.0], [40.0], [47.0, 49.0, 35.1]]

Без зацикливания возможно, но не уверен, лучше ли производительность при больших данных:

L = tmp.stack().groupby(level=1, sort=False).agg(list).tolist()
print (L)
[[28.0, 42.0, 52.0, 62.0], [46.0, 55.0], [40.0], [47.0, 49.0, 35.1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...