Pandas系列-如何验证每个项目是分类的



我正在将应该分类的数据从外部来源的csv文件导入pandas数据帧。

我想做的第一件事是验证这些值对分类类型是否有效。

我的策略是创建一个CategoricalDtype的实例,然后使用apply来测试每个值。

问题:我唯一能弄清楚的方法是测试每个值是inCategoricalDtype.categories.values;"更好";方法有什么方法可以让我达到同样的目的吗?我是CategoricalDtype的新手,感觉这不是测试数据值的最佳方式。

# example of what I'm doing
import pandas as pd
from pandas.api.types import CategoricalDtype

df = pd.read_csv('data.csv')
cat = CategoricalDtype(categories=["A", "B", "C"], ordered=False)
df['data_is_valid']=df['data_field'].apply(lambda x: x in cat.categories.values)

如果需要测试列data_field:中是否存在值

df['data_is_valid']=df['data_field'].isin(cat.categories)

如果需要也测试categorical_dtype:

from pandas.api.types import is_categorical_dtype
df['data_is_valid']=df['data_field'].isin(cat.categories) & is_categorical_dtype(df['data_field'])

差异可能见数据样本:

from pandas.api.types import CategoricalDtype
from pandas.api.types import is_categorical_dtype

df = pd.DataFrame({ "data_field": ["A", "B", "C", "D", 'E']})
cat = CategoricalDtype(categories=["A", "B", "C"], ordered=False)
#categories match but not Categorical
df['data_is_valid1']=df['data_field'].isin(cat.categories) & is_categorical_dtype(df['data_field'])
#categories match not tested Categorical
df['data_is_valid2']=df['data_field'].isin(cat.categories)
cat_type = CategoricalDtype(categories=["A", "B", "C", 'D', 'E'], ordered=True)
#created Categorical column
df['data_field'] = df['data_field'].astype(cat_type)
#categoriesand Categorical match
df['data_is_valid3']=df['data_field'].isin(cat.categories) & is_categorical_dtype(df['data_field'])
#categories match not tested Categorical
df['data_is_valid4']=df['data_field'].isin(cat.categories)
print (df)
data_field  data_is_valid1  data_is_valid2  data_is_valid3  data_is_valid4
0          A           False            True            True            True
1          B           False            True            True            True
2          C           False            True            True            True
3          D           False           False           False           False
4          E           False           False           False           False

最新更新