Как объединить строковые столбцы с нулем - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть фрейм данных:

df = pd.DataFrame({'id':[1,2,3,4], 'val1':['21','22','3','35'], 
                   'val2':['99',None,'91','67'], 'val3':['21','45','76','88']})

Я хочу объединить все значения столбцов, начиная с val, в один столбец.

Ожидаемый результат :

    id val1  val2 val3       val                                                                                                       
0   1   21    99   21  21,99,21                                                                                                       
1   2   22  None   45     22,45                                                                                                       
2   3    3    91   76   3,91,76                                                                                                       
3   4   35    67   88  35,67,88 

Что я пробовал:

df['val'] = df['val1']+","+df['val2']+","+df['val3']

Что хорошо работает, если нет значения Null, но если строка содержит None, это делает всю строку NaN

   id val1  val2 val3       val                                                                                                       
0   1   21    99   21  21,99,21                                                                                                       
1   2   22  None   45       NaN                                                                                                       
2   3    3    91   76   3,91,76                                                                                                       
3   4   35    67   88  35,67,88

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Ты рядом.Вы можете попробовать заполнить нулевые значения:

df['val'] = df.fillna('')['val1']+","+df.fillna('')['val2']+","+df.fillna('')['val3']

id val1  val2 val3       val                                                                                                       
0   1   21    99   21  21,99,21                                                                                                       
1   2   22  None   45    22,,45                                                                                                       
2   3    3    91   76   3,91,76                                                                                                       
3   4   35    67   88  35,67,88
0 голосов
/ 27 февраля 2019

Использование apply с dropna:

df['val'] = df[['val1',  'val2', 'val3']].apply(lambda x: ';'.join(x.dropna()), axis=1)
#alternative, thanks Jon Clements
#df['val'] = df.filter(regex='^val').apply(lambda x: ';'.join(x.dropna()), axis=1)
print (df)

   id val1  val2 val3       val
0   1   21    99   21  21;99;21
1   2   22  None   45     22;45
2   3    3    91   76   3;91;76
3   4   35    67   88  35;67;88

Альтернативой, если важна производительность, является использование вложенного списка:

df['val'] = [';'.join(y for y in x if isinstance(y, str))
                           for x in  df.filter(regex='^val').values]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...