Фрейм данных Pandas содержит словарь для последующей замены

#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}