【问题标题】:How to get maximum length of each column in the data frame using pandas python如何使用pandas python获取数据框中每列的最大长度
【发布时间】:2018-10-24 15:07:19
【问题描述】:

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

我知道如何计算 col 的最大长度。如果是 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 循环。但它不起作用。可能在 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

【问题讨论】:

    标签: python python-3.x pandas dataframe series


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      仅选择对象类型列

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

      获取每列的最大长度

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

      【讨论】:

      • 出于某种原因,df2 语句正在拉入所有列类型,而不仅仅是对象。
      • 我已将 'O' 更改为 'object' - 它现在应该选择对象列。
      【解决方案3】:

      使用 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()
      

      【讨论】:

      • 奇怪的是,与 24 个相比,最简单、最干净的答案只有一个赞成票。无论如何,这个答案对我来说非常适合。
      • 谢谢丹,非常感谢 :)
      【解决方案4】:

      我尝试了numpy.vectorize,但它给出了 'Memory Error' 用于巨大的数据框。

      下面的代码非常适合我。它将为您提供 excel 电子表格中每一列的最大长度列表(使用 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)
      

      【讨论】:

        【解决方案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
            ])
        

        样本输出

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

        【讨论】:

          【解决方案6】:

          一种解决方案是使用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}
          

          【讨论】:

          • 不适用于大型数据集。失败并出现警告numpy.core._exceptions.MemoryError: Unable to allocate 4.18 TiB for an array with shape (4130207, 5) and data type <U55682
          • @Harvey 在下面发布了一个非常有效的答案:for column in df: print(column,"->", df[column].astype(str).str.len().max())
          猜你喜欢
          • 1970-01-01
          • 2014-08-30
          • 2010-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多