#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