web-dev-qa-db-ja.com

pandas pythonを使用して、データフレーム内の各列の最大長を取得する方法

ほとんどの列がvarchar /オブジェクトタイプであるデータフレームがあります。列の長さはさまざまであり、3〜1000+の範囲内であれば何でもかまいません。次に、各列について、最大長を測定します。

列の最大長を計算する方法を知っています。そのvarcharの場合:

max(df.char_col.apply(len))

そして、その番号(float8またはint64)の場合:

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

しかし、私のデータフレームには数百の列があり、すべての列の最大長を同時に計算したいと思います。そのための問題は、異なるデータ型があり、一度にすべてを行う方法がわからないことです。

質問1:データフレームの各列の最大列長を取得する方法

今、私は次のコードを使用してvarchar /オブジェクトタイプの列に対してのみそれをしようとしています:

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

オブジェクトタイプの列のみを選択し、forループを記述しようとしました。しかし、機能していません。おそらくforループ内でapply()を使用するのは良い考えではありません。

質問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
5
singularity2047

1つの解決策は、 numpy.vectorize 。これは、pandasベースのソリューションよりも効率的です。

pd.DataFrame.select_dtypesobject列を選択します。

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

ここでいくつかの素晴らしい答えと私は私の貢献したいと思います

ソリューション

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}
5
alif

numpy.vectorize を試しましたが、 'Memory Error'を与えました巨大なデータフレーム。

以下のコードは私にとって完璧に機能しました。 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)
1
Azhar Ansari

オブジェクトタイプの列のみを選択する

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

各列の最大長を取得します

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