【发布时间】:2022-01-25 12:26:36
【问题描述】:
在一个相对较大的数据集中,我们使用的建模算法 (lightgbm) 检测到一个未知数据类型,该数据类型是由其中一个数字 (at最初最少)列,引发此错误消息:
ValueError: DataFrame.dtypes for data must be int, float or bool.
Did not expect the data types in the following fields: <col_name>
只能使用value_counts 找到丢失的索引值 - 其他方法会丢失它。找不到时如何用无辜的字符串替换它(但它仍然会阻塞建模算法)?
将列向下转换为整数或浮点数并不能帮助消除索引中的缺失(并将其转换为允许缺失的 pandas 扩展类型,尽管数据中没有缺失值 - NA 索引值的计数为零) .
更多信息
列的数据类型 - 具有整数值 - 是UInt32Dtype,很可能是因为索引中存在这个字符串类型的缺失值(pandas.NA 而不是numpy.nan):
test_df[col_name].value_counts(dropna=False).index
Index([1048, 1040, 1041, 1049, 1047, 1046, 1050, 1044,
1043, 1042, 1051, 1045, 1052, <NA>], dtype='object')
如您所见,NA 仅在索引中,没有与之关联的值(零计数):
test_df[col_name].value_counts(dropna=False)
1048 123099
1040 115015
1041 114987
1049 114474
1047 114124
1046 112952
1050 112453
1044 111684
1043 110286
1042 108400
1051 106731
1045 102131
1052 42033
NaN 0
Name: <col_name>, dtype: Int64
注意 pandas-only 扩展类型 Int64(不是 numpy 的 int64),它可以容纳缺失(包括这种情况下的仅索引缺失),如上所示,而 dtypes 显示另一个(32 位)类型UInt32Dtype():
test_df[col_name].dtypes
UInt32Dtype()
找到NA:
test_df[col_name].value_counts(dropna=False).index.isna().sum()
1
遗漏了什么(列表可能并不详尽):
test_df.index.isna().sum()
0
test_df[col_name].index.isna().sum()
0
test_df.index.isnull().sum()
0
test_df[col_name].index.isnull().sum()
0
(test_df.index == np.nan).any()
False
np.sum(test_df[col_name].index == pd.NA)
0
np.sum(test_df[col_name].index == "NA")
0
(test_df.index.fillna('No label') == test_df.index).all()
True
(test_df[col_name].index.fillna('No label') == test_df[col_name].index).all()
True
(pd.Series(test_df.index).replace(np.nan, 'No label') == test_df.index).all()
True
尝试将其向下转换为 float 失败:
test_df[col] = pd.to_numeric(test_df[col], errors='coerce', downcast="float")
.. 因为它被转换为另一个新奇的 pandas-only 扩展类型Float32(而不是预期的numpy's float64):
test_df[col].dtype
Float32Dtype()
.. 并且 NA 仍然保留在索引中:
test_df[col_name].value_counts(dropna=False).index
Index([1048.0, 1040.0, 1041.0, 1049.0, 1047.0, 1046.0, 1050.0, 1044.0,
1043.0, 1042.0, 1051.0, 1045.0, 1052.0, <NA>], dtype='object')
作为预防措施,我将检查管道中的所有 set_index 实例,以删除索引列中的重复数据并删除缺失(我们在各种关键列上设置索引,以在向这个大型数据集添加新部分时提高连接性能) .
相关:
【问题讨论】:
-
尝试
test_df[col_name].isna().sum()- 使用值计数,您可以获得索引中的唯一值并将它们的计数作为值。在您上面提到的所有其他情况下,您正在尝试在原始索引中搜索 NA,理想情况下不应该有任何 NA,但有问题的列会有它 -
感谢@Asish M. - 它仍然错过了索引中的 NA ......没有缺失值
标签: python pandas dataframe indexing lightgbm