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
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}
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}
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)
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()
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()