Как объединить ненулевые записи столбцов DataFrame в новый столбец? - PullRequest
3 голосов
/ 05 апреля 2019

Я пытаюсь создать новый столбец, в котором есть список всех записей прошлых столбцов, отличных от NULL.

Я хотел бы иметь возможность создавать нужный столбец без необходимостиитерация по каждой строке.

  col1   col2   col3   output       
  a      NaN    b      [a,b]        
  c      d      e      [c,d,e]      
  f      g      NaN    [f,g]        

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 05 апреля 2019

Используйте DataFrame.agg для вызова dropna и tolist:

df.agg(lambda x: x.dropna().tolist(), axis=1)

0       [a, b]
1    [c, d, e]
2       [f, g]
dtype: object

Если вам нужна вместо этого строка, разделенная запятыми, используйте str.cat или str.join:

df.agg(lambda x: x.dropna().str.cat(sep=','), axis=1)
# df.agg(lambda x: ','.join(x.dropna()), axis=1)

0      a,b
1    c,d,e
2      f,g
dtype: object

Если важна производительность, я рекомендую использовать понимание списка:

df['output'] = [x[pd.notna(x)].tolist() for x in df.values]
df

  col1 col2 col3     output
0    a  NaN    b     [a, b]
1    c    d    e  [c, d, e]
2    f    g  NaN     [f, g]

Это работает, потому что ваш DataFrame состоит из строк.Для получения дополнительной информации о том, когда петли подходят для использования с пандами, см. Это обсуждение: Для петель с пандами - Когда мне следует позаботиться?

2 голосов
/ 05 апреля 2019

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

df['New']=[[y for y in x if y == y ] for x in df.values.tolist()]
df
Out[654]: 
  col1 col2 col3        New
0    a  NaN    b     [a, b]
1    c    d    e  [c, d, e]
2    f    g  NaN     [f, g]

Или использование stack с groupby

df['New']=df.stack().groupby(level=0).agg(list)
df
Out[659]: 
  col1 col2 col3        New
0    a  NaN    b     [a, b]
1    c    d    e  [c, d, e]
2    f    g  NaN     [f, g]
1 голос
/ 05 апреля 2019

Попробуйте это:

df['output'] = df.apply(lambda x: x.dropna().to_list(), axis=1)

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