Как получить максимальную длину каждого столбца во фрейме данных с помощью Pandas Python - PullRequest
0 голосов
/ 15 мая 2018

У меня есть фрейм данных, где большинство столбцов имеют тип varchar / object. Длина столбца сильно варьируется и может быть в диапазоне от 3 до 1000+. Теперь для каждого столбца я хочу измерить максимальную длину.

Я знаю, как рассчитать максимальную длину для цв. Если его varchar то:

max(df.char_col.apply(len))

, а если его номер (float8 или int64), то:

max(df.num_col.map(str).apply(len))

Но мой фрейм данных содержит сотни столбцов, и я хочу рассчитать максимальную длину для всех столбцов одновременно. Проблема в том, что существуют разные типы данных, и я не знаю, как сделать все сразу.

Итак, вопрос 1: Как получить максимальную длину столбца для каждого столбца в кадре данных

Теперь я пытаюсь сделать это только для столбцов типа varchar / object, используя следующий код:

xx = df.select_dtypes(include = ['object'])
for col in [xx.columns.values]:
   maxlength = [max(xx.col.apply(len))]

Я выбрал только столбцы типа объекта и попытался написать цикл for. Но это не работает. вероятно, использование apply () внутри цикла for не очень хорошая идея.

Вопрос 2. Как получить максимальную длину каждого столбца только для столбцов типа объекта

Пример кадра данных:

d1 = {'name': ['john', 'tom', 'bob', 'rock', 'jimy'], 'DoB': ['01/02/2010', '01/02/2012', '11/22/2014', '11/22/2014', '09/25/2016'], 'Address': ['NY', 'NJ', 'PA', 'NY', 'CA'], 'comment1': ['Very good performance', 'N/A', 'Need to work hard', 'No Comment', 'Not satisfactory'], 'comment2': ['good', 'Meets Expectation', 'N', 'N/A', 'Incompetence']}
df1 = pd.DataFrame(data = d1)
df1['month'] = pd.DatetimeIndex(df1['DoB']).month
df1['year'] = pd.DatetimeIndex(df1['DoB']).year

Ответы [ 4 ]

0 голосов
/ 04 июля 2019

Я пытался numpy.vectorize , но он выдал «Ошибка памяти» для огромного кадра данных.

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

import pandas as pd

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

maxColumnLenghts = []
for col in range(len(df.columns)):
    maxColumnLenghts.append(max(df.iloc[:,col].astype(str).apply(len)))
print('Max Column Lengths ', maxColumnLenghts)
0 голосов
/ 15 мая 2018

Одним из решений является использование numpy.vectorize. Это может быть более эффективным, чем решения на основе pandas.

Вы можете использовать pd.DataFrame.select_dtypes для выбора object столбцов.

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['abc', 'de', 'abcd'],
                   'B': ['a', 'abcde', 'abc'],
                   'C': [1, 2.5, 1.5]})

measurer = np.vectorize(len)

Максимальная длина для всех столбцов

res1 = measurer(df.values.astype(str)).max(axis=0)

array([4, 5, 3])

Максимальная длина для столбцов объекта

res2 = measurer(df.select_dtypes(include=[object]).values.astype(str)).max(axis=0)

array([4, 5])

Или, если вам нужен вывод в виде словаря:

res1 = dict(zip(df, measurer(df.values.astype(str)).max(axis=0)))

{'A': 4, 'B': 5, 'C': 3}

df_object = df.select_dtypes(include=[object])
res2 = dict(zip(df_object, measurer(df_object.values.astype(str)).max(axis=0)))

{'A': 4, 'B': 5}
0 голосов
/ 23 июня 2019

Некоторые отличные ответы здесь, и я хотел бы внести свой

Решение

dict([(v, df[v].apply(lambda r: len(str(r)) if r!=None else 0).max())for v in df.columns.values])

Объяснение

#convert tuple to dictionary
dict( 
    [
        #create a tuple such that (column name, max length of values in column)
        (v, df[v].apply(lambda r: len(str(r)) if r!=None else 0).max()) 
            for v in df.columns.values #iterates over all column values
    ])

Пример вывода

{'name': 4, 'DoB': 10, 'Address': 2, 'comment1': 21, 'comment2': 17}
0 голосов
/ 15 мая 2018

Выбрать только столбцы типа объекта

df2 = df1[[x for x in df1 if df1[x].dtype == 'O']]

Получить максимальную длину в каждом столбце

max_length_in_each_col = df2.applymap(lambda x: len(x)).max()
...