Проверьте, существует ли значение одного столбца в другом столбце, поместите значение в другой столбец в pandas

#python #pandas

Вопрос:

Допустим, у меня есть фрейм данных, подобный следующему:

 A B C D E
a1 b1 c1 d1 e1
a2 a1 c2 d2 e2
a3 a1 a2 d3 e3
a4 a1 a2 a3 e4
 

Я хочу создать новый столбец с предопределенными значениями, если значение найдено в других столбцах.
Что-то вроде этого:

 A B C D E F
a1 b1 c1 d1 e1 NA
a2 a1 c2 d2 e2 in_B
a3 a1 a2 d3 e3 in_B, in_C
a4 a1 a2 a3 e4 in_B, in_C, in_D
 

Это in_B, in_C может быть другая строка выбора. Если значения присутствуют в нескольких столбцах, то значение F будет кратным. Пример, строки 3 и 4 столбца F (в строке 3 есть два значения, а в строке 4-три значения). До сих пор я пробовал ниже:

 DF.F=np.where(DF.A.isin(DF.B), DF.A,'in_B')
 

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

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

1. С выводом, который вы дали, какова была строка выбора?

2. Строка может быть «X», если A присутствует в B, «Y», если присутствует в C, «Z», если присутствует в D, так что, X, Y, если присутствует в B и C, и X, Y, Z, если присутствует в B, C и D. Не уверен, что это достаточно ясно.

3. Нет ясности, пожалуйста, обратитесь к вашему предпочтительному выходу и объясните нам, как, например, строка 4 становится a4 a1 a2 a3 e4 in_B, in_C, in_D

4. В новом столбце значение будет кратным, если значение A существует в нескольких столбцах. В строке 4 значение A существует в B, C и D. Имеет ли это смысл сейчас?

Ответ №1:

шаги:

  1. Stack фрейм данных.
  2. проверьте duplicate значения.
  3. unstack чтобы вернуть ту же структуру.
  4. используйте dot для получения требуемого результата.
 df['new_col'] = df.stack().duplicated().unstack().dot(
    'In '   k.columns   ',').str.strip(',')
 

выход:

     A   B   C   D   E         new_col
0  a1  b1  c1  d1  e1                
1  a2  a1  c2  d2  e2            In B
2  a3  a1  a2  d3  e3       In B,In C
3  a4  a1  a2  a3  e4  In B,In C,In D