根据字典重命名具有范围的列
Rename columns with ranges based on dictionary
我有这个数据框:
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['an2'] 来创建新列 df['an3']:
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
您可以分解值,然后映射到您的字典并重塑您的数据框:
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
让我们试试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
我有这个数据框:
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['an2'] 来创建新列 df['an3']:
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
您可以分解值,然后映射到您的字典并重塑您的数据框:
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
让我们试试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