我想找一个Pandas专栏的分类。我可以找到类型,但我很难找出分类。
titanic_df = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.csv')
#ID datatype
def idDataTypes(inputDataFrame):
columnTypesDict = {}
import numpy as np
import numbers
import pandas as pd
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
for columns in inputDataFrame.columns.values:
#print(columns)
#try to convert to number. If it doesn't work it will convert to another type
try:
inputDataFrame[columns] = pd.to_numeric(inputDataFrame[columns], errors='ignore').apply(lambda x: x + 1 if isinstance(x, numbers.Number) else x)
except:
print(columns, " cannot convert.")
#print(inputDataFrame[columns].dtype)
#create dictionary with the label
if is_numeric_dtype(inputDataFrame[columns]): #products[columns].dtype == np.float64:
columnTypesDict[columns] = "numeric"
elif is_string_dtype(inputDataFrame[columns]): # products[columns].dtype == np.object:
columnTypesDict[columns] = "string"
#print(is_string_dtype(products[columns]))
else:
print("something else", prinputDataFrameoducts[columns].dtype)
#category
cols = inputDataFrame.columns
num_cols = inputDataFrame._get_numeric_data().columns
#num_cols
proposedCategory = list(set(cols) - set(num_cols))
for value in proposedCategory:
columnTypesDict[value] = "category"
return(columnTypesDict)
idDataTypes(titanic_df)
我得到的结果不是我所期望的:
{'pclass': 'numeric',
'survived': 'numeric',
'name': 'category',
'sex': 'category',
'age': 'numeric',
'sibsp': 'numeric',
'parch': 'numeric',
'ticket': 'category',
'fare': 'numeric',
'cabin': 'category',
'embarked': 'category',
'boat': 'category',
'body': 'numeric',
'home.dest': 'category'}
pclass应该是类别,而name不应该是。
我不知道如何评估某个东西是否是一个类别。有什么想法吗?
2条答案
按热度按时间cedebl8k1#
下面是代码中的错误:
除数值列之外的所有内容都将成为类别。
也没有正确的方法来执行此操作,因为最好根据列所包含数据的知识手动确定列是否为分类列。您尝试自动执行此操作。一种方法是计算列中唯一值的数量。如果唯一值相对较少,则该列很可能为分类列。
5%阈值是随机的。如果 Dataframe 中的行少于20,则不会将任何列标识为分类列。要获得最佳结果,必须调整大小 Dataframe 的比率。
2g32fytz2#
快一点我发现的解决方法是使用Pandas。corr()方法来自动将数值列斜线化。根据我的观察,.corr()在返回整个 Dataframe 的成对相关性时自动选择数值列。(前提是你已经在整个数据集上应用了它)。因此你总是可以在你的原始 Dataframe 中线性搜索分类列,如果它不在.corr()返回的 Dataframe 中。这可能不是100%有效,但它在大部分时间都能完成任务。
PS:如果数据集包含很多列,可能会占用一些时间/内存。