如何在熊猫数据框中计算大写和小写

Posted

技术标签:

【中文标题】如何在熊猫数据框中计算大写和小写【英文标题】:How to count uppercase and lowercase on pandas dataframe 【发布时间】:2018-08-20 04:19:04 【问题描述】:

这是我的数据

No  Body                 
1   DaTa Analytics 2
2   StackOver 67

这是我的预期输出

No  Body                 Uppercase   Lowercase
1   DaTa Analytics 2     3           10
2   StackOver 67         2           7

【问题讨论】:

给我一些时间,我正在寻找一个更快的非正则表达式解决方案。 我还没有选择最佳答案 谢谢,感谢您的耐心等待。有些用户不想在打勾之前等待。 @NabihBawazir - 我用count添加了新的解决方案,你能检查一下吗? 【参考方案1】:

使用str.findall 提取大小写,使用str.len 提取长度:

df['Uppercase'] = df['Body'].str.findall(r'[A-Z]').str.len()
df['Lowercase'] = df['Body'].str.findall(r'[a-z]').str.len()

另一种解决方案:

df['Uppercase'] = df['Body'].str.count(r'[A-Z]')
df['Lowercase'] = df['Body'].str.count(r'[a-z]')

print (df)
   No            Body  Uppercase  Lowercase
0   1  DaTa Analytics          3         10
1   2       StackOver          2          7

【讨论】:

【参考方案2】:

这是一个处理 ASCII 码的高性能解决方案:

v = df.Body.values.astype(str)
v = v.view(np.uint8).reshape(len(df), -1)

df['Uppercase'] = ((v >= 65) & (v <= 90)).sum(1)
df['Lowercase'] = ((v >= 97) & (v <= 122)).sum(1)

df

   No            Body  Uppercase  Lowercase
0   1  DaTa Analytics          3         10
1   2       StackOver          2          7

时间

df = pd.concat([df] * 100000, ignore_index=True)

# @jezrael1

%%timeit
df['Uppercase'] = df['Body'].str.findall(r'[A-Z]').str.len()
df['Lowercase'] = df['Body'].str.findall(r'[a-z]').str.len()

979 ms ± 24.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# @jezrael2

%%timeit
df['Uppercase'] = [sum(1 for c in x if c.isupper()) for x in df['Body']]
df['Lowercase'] = [sum(1 for c in x if c.islower()) for x in df['Body']]

1.11 s ± 130 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# in this post

%%timeit
v = df.Body.values.astype(str)
v = v.view(np.uint8).reshape(len(df), -1)

df['Uppercase'] = ((v >= 65) & (v <= 90)).sum(1)
df['Lowercase'] = ((v >= 97) & (v <= 122)).sum(1)

91.8 ms ± 315 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

【讨论】:

这种解决方案也可以用于表情吗,表情有性能问题 @NabihBawazir 没问题,改用v.view(np.uint16) @cᴏʟᴅsᴘᴇᴇᴅ - 我添加了另一个解决方案,您可以添加时间吗?谢谢。 @jezrael 不用担心,添加 @NabihBawazir 如果还是不行,试试np.uint32,它应该能处理书中的任何unicode字符。

以上是关于如何在熊猫数据框中计算大写和小写的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中按条件累计计算几列[重复]

如何计算熊猫数据框中的非字母数字字符

如何计算熊猫数据框中每一列的唯一性?

如何计算熊猫数据框中每组的行数并将其添加到原始数据中

如何计算熊猫数据框中组的每对行之间的函数

如何根据合并的数据框之一的两列的值在熊猫数据框中添加值