如何使用python获得数据帧中每列的最大长度

如何使用python获得数据帧中每列的最大长度,python,python-3.x,pandas,dataframe,series,Python,Python 3.x,Pandas,Dataframe,Series,我有一个数据框,其中大多数列都是varchar/object类型。列的长度变化很大,可以是3-1000+范围内的任何值。现在,对于每一列,我想测量最大长度 我知道如何计算列的最大长度。如果是varchar,则: max(df.char_col.apply(len)) 如果其编号为(float8或int64),则: 但是我的dataframe有数百列,我想同时计算所有列的最大长度。问题是,有不同的数据类型,我不知道如何一次完成所有工作 问题1:如何为数据帧中的每列获取最大列长度 现在,我尝试使用

我有一个数据框,其中大多数列都是varchar/object类型。列的长度变化很大,可以是3-1000+范围内的任何值。现在,对于每一列,我想测量最大长度

我知道如何计算列的最大长度。如果是varchar,则:

max(df.char_col.apply(len))
如果其编号为(float8或int64),则:

但是我的dataframe有数百列,我想同时计算所有列的最大长度。问题是,有不同的数据类型,我不知道如何一次完成所有工作

问题1:如何为数据帧中的每列获取最大列长度

现在,我尝试使用以下代码仅对varchar/对象类型列执行此操作:

xx = df.select_dtypes(include = ['object'])
for col in [xx.columns.values]:
   maxlength = [max(xx.col.apply(len))]
我只选择了对象类型列,并尝试编写for循环。但它不起作用。在for循环中使用apply()可能不是一个好主意

问题2:如何仅为对象类型列获取每列的最大长度

df2 = df1[[x for x in df1 if df1[x].dtype == 'object']]
示例数据帧:

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

仅选择对象类型列

df2 = df1[[x for x in df1 if df1[x].dtype == 'object']]
获取每列中的最大长度

max_length_in_each_col = df2.applymap(lambda x: len(x)).max()
一个解决方案是使用。这可能比基于
的解决方案更有效

您可以使用选择
对象

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 = 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}

这里有一些很棒的答案,我想贡献我的

解决方案

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
    ])
说明

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}
我试过了,但它给出了巨大数据帧的“内存错误”

下面的代码非常适合我。它将为您提供excel电子表格中每列的最大长度列表(使用pandas读取数据框)


在使用str和len方法后,可以使用min max

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

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

查找dataframe中所有列(任何类型)的最大字符数:

for column in df:
    print(column,"->", df[column].astype(str).str.len().max())

工作速度相当快,我在8000万行df上使用它。

出于某种原因,df2语句引入了所有列类型,而不仅仅是对象。我已将“O”更改为“object”-它现在应该选择对象列。对于大型数据集不起作用。失败,出现警告
numpy.core.\u异常。MemoryError:无法为形状为(4130207,5)且数据类型为@Harvey的数组分配4.18个TiB。下面张贴了一个非常有效的答案:
对于df:print(column,“->”,df[column]。astype(str).str.len().max())
奇怪最简单的方式,最干净的答案只有一票,而不是24票。无论如何,这个答案对我来说非常有效。谢谢丹,非常感谢:)