Объединение нескольких столбцов данных в один массив под столбцом данных - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь объединить несколько столбцов (все числовые числа) в кадре данных в массив под одним столбцом данных. Предостережение: если объединяющие столбцы имеют NAN, то их не следует объединять.

Входной фрейм данных :

userid | p1 | p2 |p3 | p4 | p5
 1     | NAN| NAN| 20| 30 | 40
 1     | NAN| 30 | 60| 80 | 100
 2     | NAN| NAN|NAN| NAN| 45

Я пробовал это решение, но оно не отбрасывает NAN:

df['combined'] = df[['p5','p4','p3','p2','p1']].apply(tuple,axis=1).apply(np.array)

Окончательный вывод датафрейм должен выглядеть следующим образом (также порядок конкатенации - p5, p4, p3, p2, p1), при этом исключая nan при конкатенации:

userid | p1 | p2 |p3 | p4 | p5 | combined
 1     | NAN| NAN| 20| 30 | 40 | [40,30,20]
 1     | NAN| 30 | 60| 80 | 100| [100,80,60,30]
 2     | NAN| NAN|NAN| NAN| 45 | [45]

Так что любое решение для вышеприведенного вывода будет действительно оценено.

1 Ответ

1 голос
/ 15 октября 2019

Вы можете использовать pd.isna для фильтрации NaN значений с логической маской :

df['combined'] = df[['p5', 'p4', 'p3', 'p2', 'p1']].apply(lambda x: x[~pd.isna(x)].values, axis=1)
print(df)

Выход

   userid  p1    p2    p3    p4   p5                   combined
0       1 NaN   NaN  20.0  30.0   40         [40.0, 30.0, 20.0]
1       1 NaN  30.0  60.0  80.0  100  [100.0, 80.0, 60.0, 30.0]
2       2 NaN   NaN   NaN   NaN   45                     [45.0]

Как уже упоминалось @jpp, вы также можете удалить их, используя dropna :

lambda x: x.dropna().values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...