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

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

max(df.char_col.apply(len))

如果是数字(float8或int64),则:

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

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

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

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

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

我只 Select 了对象类型的列,并try 编写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

推荐答案

一个解决方案是使用numpy.vectorize.这可能比基于pandas的解决方案更有效.

可以使用pd.DataFrame.select_dtypes来 Select 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)

Max length for all columns

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

array([4, 5, 3])

Max length for object columns

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}

Python-3.x相关问答推荐

Gekko优化超出了方程式的界限(由于某种原因,会产生变量)

数组列的极点成对求和

无法使用Python slack 螺栓SDK读取在 slack 通道中收到的消息

正确的本地react 方式-Django身份验证

在不使用 split 函数的情况下从字符串中分割逗号(','),句号('.')和空格(' '),将字符串的单词附加到列表中

GUI 仍然有效并且没有错误消息时图形意外冻结 |具有多线程的 Pyside6 和 pyqtgraph (Python 3.11.4)

Python根据条件从多行读取值

Python (pandas) - 判断一个 df 中的值是否在另一个(不相等)df 中的任何对之间

Pandas groupby 然后 for each 组添加新行

安装没有 sudo 权限的 python3 和 pip3

位对的距离

使用正确的数据类型时,使用 Cerberus 验证 JSON 架构会引发错误

机器学习实验笔记本的工作区 url

Pytorch:图像标签

如何使我的课程在 Python 中非常可打印?

具有两个或多个返回参数的函数注释

__new__ 方法给出错误 object.__new__() 只接受一个参数(要实例化的类型)

Python 3 与 Python 2 映射行为

Python在OrderedDict中 Select 第i个元素

使用 python2 和 python3 创建一个 virtualenv