重命名具有基于字典的范围的列



我有这个数据帧:

df = pd.DataFrame( {'an2': {0: 'f', 1: 'i', 2: '', 3: '', 4: 'f', 5: 'c,f,i,g', 6: 'c,d,e,g'}} )

其屈服于:

an2
0   f
1   i
2   
3   
4   f
5   c,f,i,g
6   c,d,e,g

我想通过根据以下字典重命名df[ann2']来创建新的列df[ann3']:

dic = {'a': 'john', 
'b': 'paul', 
'c': 'mike',
'd': 'elephant',
'e': 'water', 
'f': 'bread', 
'g': 'julie',
'h': 'anna', 
'i': 'mauricio',
'j': 'claudia'}

因此,所需输出为:

an2      an3
0   f        bread
1   i        mauricio
2       
3       
4   f        bread
5   c,f,i,g  mike,bread,mauricio,claudia
6   c,d,e,g  mike,elephant,water,claudia

我试着使用上面的字典和下面的代码

df['an3'] = df['fan2'].replace(dic)

不幸的是,它只适用于在df[an2']上发现一个条目的单元格

您可以通过,dict.get的匹配拆分值来替换值,如果没有匹配,则获得原始值,最后通过,:连接回来

df['an3'] = df['an2'].apply(lambda x: ','.join(dic.get(y,y) for y in x.split(',')))
print (df)
an2                        an3
0        f                      bread
1        i                   mauricio
2                                    
3                                    
4        f                      bread
5  c,f,i,g  mike,bread,mauricio,julie
6  c,d,e,g  mike,elephant,water,julie

或者我们可调用的具有单词边界的Series.str.replace

regex = '|'.join(r"b{}b".format(x) for x in dic.keys())
df['an3'] = df['an2'].str.replace(regex, lambda x: dic[x.group()], regex=True)
print (df)
an2                        an3
0        f                      bread
1        i                   mauricio
2                                    
3                                    
4        f                      bread
5  c,f,i,g  mike,bread,mauricio,julie
6  c,d,e,g  mike,elephant,water,julie

让我们试试Series.replace:

df['an2'].replace({fr'b{k}b': v for k, v in dic.items()}, regex=True)

0                        bread
1                     mauricio
2                             
3                             
4                        bread
5    mike,bread,mauricio,julie
6    mike,elephant,water,julie
Name: an2, dtype: object

您可以分解值,然后映射到dict并重塑数据帧:

df['an3'] = df['an2'].str.split(',').explode().map(dic).dropna() 
.groupby(level=0).apply(','.join) 
.reindex(df.index, fill_value='')
print(df)
# Output
an2                        an3
0        f                      bread
1        i                   mauricio
2                                    
3                                    
4        f                      bread
5  c,f,i,g  mike,bread,mauricio,julie
6  c,d,e,g  mike,elephant,water,julie

最新更新