【问题标题】:Replace NA in pandas DataFrame index, found only by value_counts替换pandas DataFrame索引中的NA,只能通过value_counts找到
【发布时间】: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(不是 numpyint64),它可以容纳缺失(包括这种情况下的仅索引缺失),如上所示,而 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


【解决方案1】:

这摆脱了索引中持久的NA:通过将所有列值传递给numpy 数组并更改其类型(此处为int)来重构所有列值,这显然也重构了索引:

test_df[col_name] = test_df[col_name].values.astype(int)

快速检查:

test_df[col_name].value_counts(dropna=False).index.isna().sum()
0

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
Name: <col_name>, dtype: int64

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多