Pandas — добавление значений из одного столбца в список в новом столбце, если значения еще не существуют в списке нового столбца

#pandas

#pandas

Вопрос:

У меня есть фрейм данных со столбцом ( colD ), созданным из ключевых слов, извлеченных из другого столбца ( colC ). Я использовал список, содержащий все ключевые слова (‘abc’, ‘xyz’, ‘efg’, ‘rst’), но если ключевое слово не появляется в colC , оно не записывается в colD . Ключевые слова также могут существовать или не существовать в двух других столбцах ( colA и colB ). Мне интересно, есть ли способ добавить значения, если есть какие-либо из colA и / или colB , в соответствующий список в colD , если они еще не существуют в списке?

Текущее состояние:

   colA colB           colC   colD
0  abc  NaN   hi there:abc  [abc]
1  xyz  NaN   blahblahblah     []
2  efg  rst  text rst text  [rst]
  

Желаемый результат:

    colA colB          colC        colD
0   abc  NaN  hi there:abc       [abc]
1   xyz  NaN  blahblahblah       [xyz]
2   efg  rst text rst text  [rst, efg]
  

Комментарии:

1. Что вы пробовали до сих пор?

2. Я более внимательно изучил свои данные, и на самом деле для каждого идентификатора есть несколько строк, и если в любом из них есть ключевое слово colA или colB , оно также существует по крайней мере в одной из записей для этого идентификатора в colC и было записано в colD . Итак, вышесказанное больше не является проблемой для меня, но я столкнулся с другим. Рассмотрю это снова, как только решу свою новую проблему.

Ответ №1:

IIUC, сначала stack со столбцами, которые вы хотите добавить в list , затем groupby level и получите list

 s=df[['colA','colB']].stack().groupby(level=0).apply(list)
#here using the set get the different and adding the different back the colD
df.colD=[y list(set(x)-set(y))for x , y in zip(s,df.colD)]
df
Out[118]: 
  colA colB        colD
0  abc  NaN       [abc]
1  xyz  NaN       [xyz]
2  efg  rst  [rst, efg]
  

Комментарии:

1. Хотя этот код может отвечать на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность.

2. @Wen-Ben Это здорово! Я разбираю ваш ответ, чтобы лучше понять его. Вы знаете, почему операция set выводит значения в фигурных скобках? Например, set(['efg', 'rst']) - set(['rst']) дает {'efg'} .

3. @lauren.he set subtract возвращает набор {} это означает, что вы всегда можете преобразовать список с помощью list({111,222})

4. @Wen-Ben Совершенно забыл, что наборы используют фигурные скобки. Думал, что это зарезервировано для словарей, и запутался. Спасибо!