【问题标题】:What is the fastest way to check whether a cell contains letters?检查单元格是否包含字母的最快方法是什么?
【发布时间】:2019-05-07 11:48:17
【问题描述】:

我有一个包含 260 万行的数据集,其中有一列名为 msgText,其中包含书面消息。

现在,我想过滤掉所有不包含任何字母的消息。为此,我找到了以下代码:

dataset = dataset[dataset['msgText'].astype(str).str.contains('[A-Za-z]')]

但是,16 小时后代码仍在运行。

此外,基于Does Python have a string 'contains' substring method?,我考虑创建一个长度为 26 的列表,其中包含字母表中的所有字母,然后检查每个单元格是否包含该字母。但这似乎也没有效率。

因此,我想知道是否有更快的方法来查找单元格是否包含字母。


编辑:上面的代码运行良好。显然,我的(慢)代码中的内容是:dataset['msgText'] = dataset[dataset['msgText'].astype(str).str.contains('[A-Za-z]')]

【问题讨论】:

  • 我实际测试了您的代码,完成以下数据帧大约需要 5-6 秒:df = pd.DataFrame({'msgText': ['aasad dasd ', 'bdsd e ', 'ggre qew ', '1 1 1 ']*2600000})
  • 您的字符串中是否包含空格或特殊字符?还是总是像 '12adwf1231''123'

标签: python pandas contains


【解决方案1】:
import pandas

dataset['columnName'].apply(lambda x: x.find('\\w') > 0)

【讨论】:

  • 这不会出错,但也不起作用。之后:dataset['msgText'].iloc[0] = '?!)',我运行了你的代码,它输出 False,就像包含字母的单元格一样
  • 好的,我无法测试它,但诀窍是 lambda 函数。您还可以在将值作为属性的方法中提取它,然后从中返回您想要的任何内容。现在它返回一个可能被忽略的布尔值,这就是它不做任何事情的原因。你也可以使用正则表达式:w3schools.com/python/showpython.asp?filename=demo_regex_seq8
【解决方案2】:

你可以使用 numpy 的 isalpha() 方法。 (据说 Numpy 比 pandas 快)

df = pd.DataFrame({'msgText': ['a', 'b', 'g', '1']})
column = df['msgText']
column[column.str.replace(' ','').str.isalpha()]

会返回:

0    a
1    b
2    g
Name: msgText, dtype: object

260 万行的测试用例:

导入日期时间

df = pd.DataFrame({'msgText': ['a', 'b', 'g', '1']*2600000})
column = df['msgText']
start = datetime.datetime.now()
new_col = column[column.str.replace(' ','').str.isalpha()]
end = datetime.datetime.now()
print(f'Time taken: {end - start}; Shape: {new_col.shape}')

OUTPUT:
Time taken: 0:00:06.144576; Shape: (7800000,)

【讨论】:

  • 此代码还会删除同时包含字母和数字/其他字符的单元格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2011-03-19
  • 2012-12-21
相关资源
最近更新 更多