将 pd.convert_dtypes() 应用于数据帧后出现 Numpy 错误

问题描述 投票:0回答:1

这个 python 代码片段按照我想要的方式工作。

import pandas as pd
import numpy as np

dfn = pd.read_csv("dirtydata.csv")
bike_sales_ds = dfn.copy()

# Create new age column with general age range groups
age_conditions = [
    (bike_sales_ds['Age'] <= 30),
    (bike_sales_ds['Age'] >= 31) & (bike_sales_ds['Age'] <= 40),
    (bike_sales_ds['Age'] >= 41) & (bike_sales_ds['Age'] <= 55),
    (bike_sales_ds['Age'] >= 56) & (bike_sales_ds['Age'] <= 69),
    (bike_sales_ds['Age'] >= 70)
                ]
age_choices = ['30 or Less', '31 to 40', '41 to 55', '56 to 69', '70 or Older']

bike_sales_ds['Age_Range'] = np.select(age_conditions, age_choices, default='error')

我尝试按如下方式添加 .convert_dtypes() 方法,现在出现此错误。

df = pd.read_csv("dirtydata.csv")
dfn = df.convert_dtypes()
bike_sales_ds = dfn.copy()

回溯(最后一次通话): 文件“C:\Users\dmcfa\PycharmProjects\Bike Sales Data Cleaning 01\main.py”,第 43 行,位于 bike_sales_ds['Age_Range'] = np.select(age_conditions, age_choices, default=0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 选择文件“<array_function internals>”,第 200 行 文件“C:\Users\dmcfa\PycharmProjects\Bike Sales Data Cleaning 01 env\Lib\site-packages umpy\lib unction_base.py”,第 845 行,在选择中 提高类型错误( TypeError:condlist 中的无效条目 0:应该是 boolean ndarray

我不明白的部分是 df.info() 暗示 convert_dtypes() 没有改变 Age 列的类型。在方法之前和之后都是 Int64。将 convert_integer 设置为 false 可以解决问题,但我不明白为什么它很重要。

有人能解释一下 numpy 的幕后发生了什么,或者这与熊猫推理规则有关吗?

python pandas numpy-ndarray type-inference dtype
1个回答
0
投票

您的代码适用于我的输入数据框。但是,您可以使用

pd.cut
来检查问题是否仍然存在:

age_conditions = [0, 30, 40, 55, 69, np.inf]
age_choices = ['30 or Less', '31 to 40', '41 to 55', '56 to 69', '70 or Older']

bike_sales_ds['Age_Range'] = pd.cut(bike_sales_ds['Age'],
                                    bins=age_conditions,
                                    labels=age_choices)

输出:

>>> bike_sales_ds
    Age    Age_Range
0    87  70 or Older
1    25   30 or Less
2    70  70 or Older
3    55     41 to 55
4    33     31 to 40
..  ...          ...
95   89  70 or Older
96   79  70 or Older
97   67     56 to 69
98   71  70 or Older
99   78  70 or Older

[100 rows x 2 columns]

输入:

import pandas as pd
import numpy as np

np.random.seed(2023)
bike_sales_ds = pd.DataFrame({'Age': np.random.randint(0, 100, 100)})
© www.soinside.com 2019 - 2024. All rights reserved.