Добавьте два значения столбцов с ‘,’ между ними, только если ни одна из ячеек не имеет значения null

#python #pandas #cell #add

#python #pandas #ячейка #Добавить

Вопрос:

У меня есть следующий фрейм данных:

 >>>name   breakfast  lunch   dinner
0 Zoey    apple      egg     noodels
1 Rena    pear               pasta
2 Shila             tomato  potatoes
3 Daphni coffee             soup 
4 Dufi                  
  

Я хотел бы создать новый столбец, в котором будут указаны все значения продуктов, которые каждое имя съело в один и тот же день. Я попытался сделать это, используя ‘ ‘ и разделять слова с помощью ‘,’ следующим образом:

 df['food']=df['breakfast'] ',' df['lunch'] ',' df['dinner']
  

но тогда, если у меня есть значения null, у меня есть ‘,’ в середине:

 
>>>name   breakfast  lunch   dinner     food
0 Zoey    apple      egg     noodels    apple,egg,noodels
1 Rena    pear               pasta      pear,,pasta
2 Shila             tomato  potatoes    ,tmatoe,potatoes
3 Daphni coffee             soup       coffee,,soupp
4. Dufi                                ,,
  

и я хотел бы очистить его с помощью ‘,’ в нужных местах, например, не ставить, если есть null:

 >>>name   breakfast  lunch   dinner     food
0 Zoey    apple      egg     noodels    apple,egg,noodels
1 Rena    pear               pasta      pear,pasta
2 Shila             tomato  potatoes    tmatoe,potatoes
3 Daphni coffee             soup       coffee,soup
4 Dufi                  
  

есть ли какой-либо способ сделать это? чтобы определить, что если есть нулевая ячейка, не добавляйте ее / не помещайте в неправильные места

Ответ №1:

используйте .stack with groupby в вашем индексе.

предполагая, что ваши пробелы на самом деле являются истинными нулями

поскольку нам не нужно name, мы можем либо добавить его в индекс, либо удалить, я добавил его здесь.

 df['food'] = df.set_index('name',append=True).stack().groupby(level=0).agg(','.join)
  

если ваши пробелы не являются null, мы можем сделать

 df.replace(' ', np.nan).set_index('name',append=True).stack()
                       .groupby(level=0).agg(','.join)
  

     name breakfast     lunch   dinner               food
0    Zoey     apple       egg  noodels  apple,egg,noodels
1    Rena      pear     pasta      NaN         pear,pasta
2   Shila    tomato  potatoes      NaN    tomato,potatoes
3  Daphni    coffee      soup      NaN        coffee,soup
4    Dufi       NaN       NaN      NaN                NaN
  

Ответ №2:

Решение, если нет пропущенных значений, объединяются только пустые строки, только значения, фильтрующие пустые строки:

 cols = ['breakfast','lunch','dinner']
df['food'] = df[cols].apply(lambda x: ','.join(y for y in x if y != ''), axis=1)
print (df)
     name breakfast   lunch    dinner               food
0    Zoey     apple     egg   noodels  apple,egg,noodels
1    Rena      pear             pasta         pear,pasta
2   Shila            tomato  potatoes    tomato,potatoes
3  Daphni    coffee              soup        coffee,soup
4   Dufi                                                
  

Или с пониманием списка:

 cols = ['breakfast','lunch','dinner']
df['food'] = [','.join(y for y in x if y != '') for x in df[cols].to_numpy()]
print (df)
     name breakfast   lunch    dinner               food
0    Zoey     apple     egg   noodels  apple,egg,noodels
1    Rena      pear             pasta         pear,pasta
2   Shila            tomato  potatoes    tomato,potatoes
3  Daphni    coffee              soup        coffee,soup
4   Dufi                                                
  

Решение, если пропущенные значения похожи, используйте только NaN != NaN :

 cols = ['breakfast','lunch','dinner']
df['food'] = [','.join(y for y in x if y == y) for x in df[cols].to_numpy()]
print (df)
     name breakfast   lunch    dinner               food
0    Zoey     apple     egg   noodels  apple,egg,noodels
1    Rena      pear     NaN     pasta         pear,pasta
2   Shila       NaN  tomato  potatoes    tomato,potatoes
3  Daphni    coffee     NaN      soup        coffee,soup
4   Dufi        NaN     NaN       NaN