#python #pandas
#python #pandas
Вопрос:
У меня есть фрейм данных со столбцами A и B. Я хочу сказать, что для каждой строки, если A содержит «Fred», тогда B называется «Blue».
Я могу сделать это с помощью этой строки
df.loc[df['A'].str.contains('Fred'),'B']='Blue'
Я хотел бы сделать это в цикле словаря.
итак
dict = {'Fred':'blue','Jess':'red','David':'Green'}
как бы мне превратить это в цикл?
Пример df
0 FREDDDD xxx
1 dfdfa dfdf
2 dfdf dfsd
3 GFDFJESS sdfedf
4 sdfdsfds dsfd
Ожидаемый результат
0 FREDDDD blue
1 dfdfa dfdf
2 dfdf dfsd
3 GFDFJESS red
4 sdfdsfds dsfd
Комментарии:
1.
dic
Всегда ли есть только две записи?2. нет, у него будут нагрузки
3. только что сделал 2 для примера
4. Хорошо, в этом случае что, если A содержит что-либо, кроме Fred и Jess?
5. Я понимаю, к чему вы клоните, но выходных данных будет намного больше, чем TRUE и FALSE. итак, Fred = 1, Jess = 2, George= Blue, Matt = car и т.д.
Ответ №1:
Давайте используем str.extract
с Series.map
:
df = pd.DataFrame({
'A': ['Fred Flintstone', 'Jessie', 'Jess abcxyz', 'something else']})
df
A
0 Fred Flintstone
1 Jessie
2 Jess abcxyz
3 something else
p = r'({})'.format('|'.join(dic.keys()))
df['A'].str.extract(p, expand=False).map(dic)
0 TRUE
1 FALSE
2 FALSE
3 NaN
Name: A, dtype: object
Ответ №2:
Используя findall
с map
, затем назначьте его обратно
s=df.A.str.findall('|'.join(dic.keys())).str[0].map(dic)
df.loc[s.notnull(),'B']=s
df
Out[1077]:
A B
0 Fred llll blue
1 CHECK 1
2 Jess mmm red
3 CHECK 3
4 efg NaN
5 ijk 3
6 lmn 1
7 opq 7
Ответ №3:
Используйте что-то вроде:
print(df) #dummy dataframe
Name some_col
0 Fred 1.0
1 CHECK 1.0
2 Jess NaN
3 CHECK 3.0
4 efg NaN
5 ijk 3.0
6 lmn 1.0
7 opq 7.0
d=dict(zip(df.Name,df.Name.str.contains('Fred')))
print(d)
{'Fred': True,
'CHECK': False,
'Jess': False,
'efg': False,
'ijk': False,
'lmn': False,
'opq': False}