Подтвердить что ты не робот

Найти длину самой длинной строки в столбце данных Pandas

Есть ли более быстрый способ найти длину самой длинной строки в кадре данных Pandas, чем показано в примере ниже?

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

Для запуска df.col1.map(lambda x: len(x)).max() требуется около 10 секунд при синхронизации с IPython %timeit.

4b9b3361

Ответ 1

Похоже, что DSM - лучшее из того, что вы получите, не проводя ручную микрооптимизацию:

%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

Обратите внимание, что явное использование str.len() не кажется значительным улучшением. Если вы не знакомы с IPython, из которого исходит этот очень удобный синтаксис %timeit, я определенно рекомендую %timeit его для быстрого тестирования подобных вещей.

Обновление Добавлен скриншот:

enter image description here

Ответ 2

Так же, как незначительное дополнение, вам может понадобиться выполнить цикл всех столбцов объектов в кадре данных:

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

Это предотвратит ошибки, вызываемые типами bool, int и т.д.

Может быть расширен для других нечисловых типов, таких как 'string_', 'unicode_' i.e.

if df[c].dtype in ('object', 'string_', 'unicode_'):

Ответ 3

Иногда вам нужна длина самой длинной строки в байтах. Это актуально для строк, которые используют причудливые символы Юникода, и в этом случае длина в байтах больше, чем обычная длина. Это может быть очень актуально в определенных ситуациях, например, для записи в базу данных.

df_col_len = int(df[df_col_name].str.encode(encoding='utf-8').str.len().max())

В строке выше str.encode(encoding='utf-8') дополнительный str.encode(encoding='utf-8'). Выходные данные заключены в int() потому что в противном случае это пустой объект.

Ответ 4

Вы должны попробовать использовать NumPy. Это также может помочь вам повысить эффективность.

Приведенный ниже код предоставит вам максимальную длину для каждого столбца в таблице Excel (считайте в кадре данных, используя панд)

import pandas as pd
import numpy as np

xl = pd.ExcelFile('sample.xlsx')
df = xl.parse('Sheet1')

columnLenghts = np.vectorize(len)
maxColumnLenghts = columnLenghts(df.values.astype(str)).max(axis=0)
print('Max Column Lengths ', maxColumnLenghts)