在datafram中将字符串列转换为数字

2024-10-02 06:38:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将数据帧中的列转换为数字。输入是从电子邮件地址提取的电子邮件域。样品:

>>> data['emailDomain']
0                         [gmail]
1                         [gmail]
2                         [gmail]
3                           [aol]
4                         [yahoo]
5                         [yahoo]

我想创建一个新列,如果域是gmailaol,则列条目将是1,否则为0。 我创建了一个方法,如下所示:

^{pr2}$

用起来像:

data['validEmailDomain'] = data.apply(convertToNumber, axis=1)

然而,我的输出列是0,即使我知道输入列中有gmail和aol电子邮件。 知道会出什么问题吗?在

另外,我认为使用条件语句可能不是解决这个问题的最有效方法。有没有其他方法来完成这个任务?在


Tags: 数据方法data电子邮件地址样品条目数字
3条回答

您可以通过列表理解总结每个提供程序的发生检查,并将结果列表写入data['validEmailDomain']

providers = ['gmail', 'aol', 'outlook', 'hotmail', 'yahoo']
data['validEmailDomain'] = [np.sum([p in e for p in providers]) for e in data['emailDomain'].values]

您可以使用^{}

providers = {'gmail', 'aol', 'yahoo','hotmail', 'outlook'}
data['emailDomain'].isin(providers)

正在搜索提供程序

与对每行中的每个电子邮件应用re不同,您可以使用^{}方法一次对一个列执行该操作

^{pr2}$

所以就变成这样:

pattern2 = '(?<=@)([^.]+)(?=\.)'
providers = {'gmail', 'aol', 'yahoo','hotmail', 'outlook'}
df = pd.DataFrame(data={'email': ['test.1@gmail.com', 'test.2@aol.com', 'test3@something.eu']})

provider_serie = df['email'].str.extract(pattern2, expand=False)
0        gmail
1          aol
2    something
Name: email, dtype: object
^{4}$
0     True
1     True
2    False
Name: email, dtype: bool

如果您真的想要0s和1s,可以添加.astype(int)

如果你的系列包含字符串,你的代码就可以工作了。因此,它们可能包含列表,在这种情况下,您需要提取第一个元素。在

我还将使用pd.Series.map,而不是使用任何行逻辑。下面是一个完整的例子:

df = pd.DataFrame({'emailDomain': [['gmail'], ['gmail'], ['gmail'], ['aol'],
                                   ['yahoo'], ['yahoo'], ['else']]})

domains = {'gmail', 'aol', 'outlook', 'hotmail', 'yahoo'}

df['validEmailDomain'] = df['emailDomain'].map(lambda x: x[0]).isin(domains)\
                                          .astype(int)

print(df)

#   emailDomain  validEmailDomain
# 0     [gmail]                 1
# 1     [gmail]                 1
# 2     [gmail]                 1
# 3       [aol]                 1
# 4     [yahoo]                 1
# 5     [yahoo]                 1
# 6      [else]                 0

相关问题 更多 >

    热门问题