熊猫数据框包含然后替换字典

时间:2019-03-11 14:52:36

标签: 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

3 个答案:

答案 0 :(得分:4)

str.extractSeries.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

答案 1 :(得分: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}

答案 2 :(得分:3)

findallmap一起使用,然后将其分配回

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