sin*_*047 5 python series dataframe python-3.x pandas
我有一个数据框,其中大多数列都是varchar / object类型。柱的长度变化很大,并且可以在3-1000+范围内。现在,对于每一列,我想测量最大长度。
我知道如何计算col的最大长度。如果是varchar,则:
max(df.char_col.apply(len))
Run Code Online (Sandbox Code Playgroud)
如果其编号(float8或int64),则:
max(df.num_col.map(str).apply(len))
Run Code Online (Sandbox Code Playgroud)
但是我的数据框有数百列,因此我想同时计算所有列的最大长度。问题在于,存在不同的数据类型,我不知道如何一次完成所有操作。
那么问题1:如何获取数据帧中每一列的最大列长
现在,我尝试使用以下代码仅对varchar / object类型的列执行此操作:
xx = df.select_dtypes(include = ['object'])
for col in [xx.columns.values]:
maxlength = [max(xx.col.apply(len))]
Run Code Online (Sandbox Code Playgroud)
我仅选择对象类型列,并尝试编写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
Run Code Online (Sandbox Code Playgroud)
Har*_*vey 16
查找数据框中所有列(任何类型)的最大字符数:
for column in df:
print(column,"->", df[column].astype(str).str.len().max())
Run Code Online (Sandbox Code Playgroud)
工作速度相当快,我在 8000 万行 df 上使用它。
MSa*_*lal 10
您可以在使用 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()
Run Code Online (Sandbox Code Playgroud)
一种解决方案是使用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)
Run Code Online (Sandbox Code Playgroud)
所有列的最大长度
res1 = measurer(df.values.astype(str)).max(axis=0)
array([4, 5, 3])
Run Code Online (Sandbox Code Playgroud)
对象列的最大长度
res2 = measurer(df.select_dtypes(include=[object]).values.astype(str)).max(axis=0)
array([4, 5])
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要将输出作为字典:
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}
Run Code Online (Sandbox Code Playgroud)
仅选择对象类型列
df2 = df1[[x for x in df1 if df1[x].dtype == 'object']]
Run Code Online (Sandbox Code Playgroud)
获取每列的最大长度
max_length_in_each_col = df2.applymap(lambda x: len(x)).max()
Run Code Online (Sandbox Code Playgroud)
小智 5
Some great answers here and I would like to contribute mine
Solution:
dict([(v, df[v].apply(lambda r: len(str(r)) if r!=None else 0).max())for v in df.columns.values])
Run Code Online (Sandbox Code Playgroud)
Explanation:
#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
])
Run Code Online (Sandbox Code Playgroud)
Sample output
{'name': 4, 'DoB': 10, 'Address': 2, 'comment1': 21, 'comment2': 17}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8147 次 |
| 最近记录: |