web-dev-qa-db-fra.com

Comment obtenir la longueur maximale de chaque colonne dans la trame de données en utilisant pandas python

J'ai un bloc de données où la plupart des colonnes sont de type varchar/objet. La longueur de la colonne varie beaucoup et peut être comprise entre 3 et 1 000+. Maintenant, pour chaque colonne, je veux mesurer la longueur maximale.

Je sais comment calculer la longueur maximale d'un col. Si son varchar alors:

max(df.char_col.apply(len))

et si son numéro (float8 ou int64) alors:

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

Mais mon dataframe a des centaines de colonnes et je veux calculer la longueur maximale pour toutes les colonnes en même temps. Le problème est qu'il existe différents types de données et je ne sais pas comment faire tout en même temps.

Donc, question 1: comment obtenir la longueur de colonne maximale pour chaque colonne du bloc de données

Maintenant, j'essaie de le faire uniquement pour les colonnes de type varchar/objet en utilisant le code suivant:

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

J'ai sélectionné uniquement les colonnes de type d'objet et j'ai essayé d'écrire une boucle for. Mais ça ne marche pas. utiliser probablement apply () dans la boucle for n'est pas une bonne idée.

Question 2: Comment obtenir la longueur maximale de chaque colonne pour les colonnes de type objet uniquement

Exemple de trame de données:

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
6
singularity2047

Une solution consiste à utiliser numpy.vectorize . Cela peut être plus efficace que les solutions basées sur pandas.

Vous pouvez utiliser pd.DataFrame.select_dtypes pour sélectionner les colonnes 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)

Longueur maximale pour toutes les colonnes

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

array([4, 5, 3])

Longueur maximale des colonnes d'objets

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

array([4, 5])

Ou si vous avez besoin d'une sortie sous forme de dictionnaire:

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}
11
jpp

Quelques bonnes réponses ici et je voudrais apporter la mienne

Solution:

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

Explication:

#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
    ])

exemple de sortie

{'name': 4, 'DoB': 10, 'Address': 2, 'comment1': 21, 'comment2': 17}
5
alif

J'ai essayé numpy.vectorize mais cela a donné 'Erreur de mémoire' pour une énorme trame de données.

Le code ci-dessous a parfaitement fonctionné pour moi. Il vous donnera une liste des longueurs maximales pour chaque colonne dans une feuille de calcul Excel (lue dans une trame de données à l'aide de pandas)

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)
2
Azhar Ansari

Sélectionnez uniquement les colonnes de type d'objet

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

Obtenez la longueur maximale dans chaque colonne

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

Vous pouvez utiliser min max après avoir utilisé la méthode str et len

df["A"].str.len().max()
df["A"].str.len().min()

df["Column Name"].str.len().max()
df["Column Name"].str.len().min()
0
MSallal