【问题标题】: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添加了新的解决方案,你能检查一下吗?

标签: python string pandas text feature-extraction


【解决方案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字符。
    猜你喜欢
    • 2018-08-20
    • 2019-01-13
    • 2013-11-12
    • 1970-01-01
    • 2020-02-10
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多