python - 替换数据框中列表的名称
问题描述
我正在尝试替换数据框中的列表名称(C 列):
姓名列表(小例子,列表太大):
Jack
Liam
John
Ethan
George
...
小数据框示例:
A B C
French house Phone <phone_numbers>
English house email <adresse_mail>
French apartment my name is Liam
French house Hello George
English apartment Ethan, my phone is <phone_numbers>
我的脚本:
import re
import pandas as pd
from pandas import Series
df = pd.read_excel('data_frame.xlsx')
data = Series.to_string(df['C'])
first_names = open('names_list.txt', 'r')
names_read = first_names.readlines()
def names(data):
names_regex = re.compile(r'\b%s\b' % r'\b|\b'.join(map(re.escape, names_read)))
replace_names = names_regex.sub('<name>', data)
return replace_names
no_names = names(data)
print(no_names)
作为输出,我有我的整个数据框没有任何修改......
我期望:
C
Phone <phone_numbers>
email <adresse_mail>
my name is <name>
Hello <name>
<name>, my phone is <phone_numbers>
解决方案
name_list = ['Jack', 'Liam', 'John', 'Ethan']
mydf = pd.DataFrame({'C': ['Phone <phone_numbers>', 'email <adresse_mail>', 'my name is Liam', 'Hello George', 'Ethan, my phone is <phone_numbers>']})
您可以根据您的名单定义一个正则表达式。然后,您将这些值与列匹配C
并将它们替换为apply lambda
match = mydf.C.str.extractall('(' + '|'.join(name_list) + ')').reset_index().set_index('level_0').rename(columns={0: 'name'})
mydf = pd.concat([mydf, match], axis=1)
condition = mydf.match.notnull()
mydf.loc[condition, 'C'] = mydf[condition].apply(lambda x: x['C'].replace(x['name'], '<name>'), axis=1)
输出
C match name
0 Phone <phone_numbers> NaN NaN
1 email <adresse_mail> NaN NaN
2 my name is <name> 0.0 Liam
3 Hello <name> 0.0 George
4 <name>, my phone is <phone_numbers> 0.0 Ethan
推荐阅读
- zsh - zsh:创建命名文件代替参数?
- yolo - 将原始 YOLO 输出转换为边界框
- office-ui-fabric - 如何使 DetailsList 标题显示工具提示
- plc - 如何在 Twincat3 PLC 中进行原子语句?
- laravel - Laravel 文件下载无法在 OVH 上运行,返回 403
- python - 在网络服务器上从 Laravel 执行 Python 脚本
- json - 如何强制 cloudflare 缓存它一直归类为 CF-Cache-Status: DYNAMIC 的 api?
- javascript - 使用宏创建一个按钮来查找+替换
- vue.js - 使用 vuejs 动态更改选项时选择不呈现新的:值
- c++ - 用户在 C++ 中输入使用 strftime() 格式化的日期