python3pandas使用字符串和Regex标记数据帧中的数据

2024-09-30 18:26:22 发布

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

所以我有两种方法来做同样的事情,我想知道哪一种更有效:

第一种方法从文本文件或数组加载列表,并使用列表标记数据帧:

import pandas as pd

ban_list = ['Al Gore', 'Kim jong-un','Kim jong un','Kim Jong Un', 'Al Sharpton','Kim jong il', 'Richard Johnson', 'Dick Johnson']

df=pd.DataFrame({'Users': [ 'Al Gore', 'Kim jong il', 'Kim jong un', 'Al Sharpton', 'James', 'Richard Johnson', 'Bill Gates', 'Alf pig', 'Dick Johnson', 'Python Monte'],
                 'Time': ['D','D','N','D','L','N', 'N','L','L','N']})

df['Banned'] = ''


for i in range(len(ban_list)):
    df.loc[df.Users.str.contains(ban_list[i]) & (df.Banned == ''),'Banned'] = 'Yes'

第二种方法使用正则表达式模式而不是名称列表

^{pr2}$

这两组代码的工作原理和作用都是一样的。到目前为止,问题是第一个不能区分大小写,第二个有一个警告UserWarning: This pattern has match groups. To actually get the groups, use str.extract. " groups, use str.extract.", UserWarning)

第一种方式的数组加载一个大的列表,第二种方式有多个步骤的regex。我应该用哪一个来提高效率?或者有其他方法可以改善这种情况吗?在


Tags: 方法df列表数组listunpdgroups
1条回答
网友
1楼 · 发布于 2024-09-30 18:26:22

使用isin似乎有点干净(至少对我来说)因为你有一个很好的被禁用户列表(然后你可以将True/False映射为Yes/'':

df['Banned'] = df.Users.isin(ban_list).map({True:'Yes',False:''})
print df

  Time            Users Banned
0    D          Al Gore    Yes
1    D      Kim jong il    Yes
2    N      Kim jong un    Yes
3    D      Al Sharpton    Yes
4    L            James       
5    N  Richard Johnson    Yes
6    N       Bill Gates       
7    L          Alf pig       
8    L     Dick Johnson    Yes
9    N     Python Monte       

当然,如果True/False足够好,您可以只执行命令的第一部分:

^{pr2}$

编辑:如果你有第二个列表,我会按如下方式进行:

^{3}$

相关问题 更多 >