#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:
шаги:
Stack
фрейм данных.- проверьте
duplicate
значения. unstack
чтобы вернуть ту же структуру.- используйте
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