在Pandas数据帧列中查找最长字符串的长度

ebr*_*ert 42 python pandas

是否有更快的方法来查找Pandas DataFrame中最长字符串的长度,而不是下面示例中显示的长度?

import numpy as np
import pandas as pd

x = ['ab', 'bcd', 'dfe', 'efghik']
x = np.repeat(x, 1e7)
df = pd.DataFrame(x, columns=['col1'])

print df.col1.map(lambda x: len(x)).max()
# result --> 6
Run Code Online (Sandbox Code Playgroud)

df.col1.map(lambda x: len(x)).max()使用IPython进行计时时,运行大约需要10秒钟%timeit.

Mar*_*ius 67

帝斯曼的建议似乎是关于没有做一些手动微优化的最佳方法:

%timeit -n 100 df.col1.str.len().max()
100 loops, best of 3: 11.7 ms per loop

%timeit -n 100 df.col1.map(lambda x: len(x)).max()
100 loops, best of 3: 16.4 ms per loop

%timeit -n 100 df.col1.map(len).max()
100 loops, best of 3: 10.1 ms per loop
Run Code Online (Sandbox Code Playgroud)

请注意,明确使用该str.len()方法似乎没有太大的改进.如果您不熟悉IPython,这是非常方便的%timeit语法来源,我肯定建议快速测试这样的事情.

更新添加的截图:

在此输入图像描述

  • 需要说明的一点是 str.len 方法是 NaN 等稳健的。 (2认同)

Blo*_*Pig 7

作为次要添加,您可能希望遍历数据框中的所有对象列:

for c in df:
    if df[c].dtype == 'object':
        print('Max length of column %s: %s\n' %  (c, df[c].map(len).max()))
Run Code Online (Sandbox Code Playgroud)

这将防止bool,int类型等引发错误.

可以扩展为其他非数字类型,如'string_','unicode_'即

if df[c].dtype in ('object', 'string_', 'unicode_'):
Run Code Online (Sandbox Code Playgroud)


Acu*_*nus 5

有时,您想要最长的字符串的长度(以字节为单位)。这与使用特殊Unicode字符的字符串有关,在这种情况下,以字节为单位的长度大于常规长度。这在特定情况下可能非常相关,例如对于数据库写入

df_col_len = int(df[df_col_name].str.encode(encoding='utf-8').str.len().max())
Run Code Online (Sandbox Code Playgroud)

上面的行有多余的内容str.encode(encoding='utf-8')。封闭输出,int()因为否则它是一个numpy对象。