Найти длину самой длинной строки в столбце данных 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
.
Ответы
Ответ 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)