Как объединить N нечисловых столбцов при удалении нулевых значений? - PullRequest
0 голосов
/ 07 сентября 2018

Построение по этому вопросу Объединение столбцов и удаление NaNs Pandas ,

У меня есть датафрейм, который выглядит так:

col     x       y        z

a1      a       NaN      NaN
a2      NaN     b        NaN
a3      NaN     c        NaN
a4      NaN     NaN      d
a5      NaN     e        NaN
a6      f       NaN      NaN
a7      g       NaN      NaN
a8      NaN     NaN      NaN

Значения ячеек - это строки, а NaN - произвольные нулевые значения.

Я хотел бы объединить столбцы, чтобы добавить новый объединенный столбец следующим образом:

col  w

a1   a
a2   b
a3   c
a4   d
a5   e
a6   f
a7   g
a8   NaN

В элегантном решении, предложенном в приведенном выше вопросе, используется

df['w']=df[['x','y','z']].sum(axis=1)

но сумма не работает для нечисловых значений.

Как, в данном случае для строк, объединить столбцы в один столбец?

Вы можете предположить:

  1. Каждая строка имеет только одну из x, y, z, которая не равна нулю.
  2. На отдельные столбцы необходимо ссылаться по имени (поскольку они являются подмножеством всех доступных столбцов в кадре данных).
  3. Обычно в подмножестве N, а не только 3 столбца.
  4. Надеюсь, не использовать для циклов iloc / for: \

Обновление: (извинения тем, кто уже дал ответы: \)

  1. Я добавил последнюю строку, где каждый столбец содержит NaN, и я хотел бы, чтобы объединенная строка отражала это. Спасибо + извините!

Спасибо, как всегда, за помощь

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Вместо общей суммы, вы должны применить пользовательскую функцию. Например, этот работает на вашем примере:

import numpy as np
f = lambda x: x[x.notnull()][0] if any(x.notnull()) else np.nan
df['w'] = df[list('xyz')].apply(f, axis=1)
0 голосов
/ 07 сентября 2018

Вот еще одно решение:

df['res'] = df.fillna('').sum(1).replace('', np.nan)

Результат

       x    y    z  res
col                    
a1     a  NaN  NaN    a
a2   NaN    b  NaN    b
a3   NaN    c  NaN    c
a4   NaN  NaN    d    d
a5   NaN    e  NaN    e
a6     f  NaN  NaN    f
a7     g  NaN  NaN    g
a8   NaN  NaN  NaN  NaN
0 голосов
/ 07 сентября 2018

Я думаю, вам нужно:

s = df[['x','y','z']]
df['w'] = s.values[s.notnull()]
df[['col','w']]

Или после редактирования вопроса:

df['w'] = pd.DataFrame(df[['x','y','z']].apply(lambda x: x.values[x.notnull()],axis=1).tolist())
df[['col','w']].fillna(np.nan)

Что дает

    col w
0   a1  a
1   a2  b
2   a3  c
3   a4  d
4   a5  e
5   a6  f
6   a7  g
7   a8  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...