【问题标题】:Invalid object error when trying to convert from object to integers尝试从对象转换为整数时出现无效对象错误
【发布时间】:2018-03-26 20:53:00
【问题描述】:

我很清楚以前有人问过类似性质的问题,但是在尝试了大多数传统方法后,我完全不知所措。

我有一个包含多个变量的数据框,我从中选择了 5 个变量并将这些变量分组到一个公共属性:“城市”。

我正在尝试根据每个城市从属性“driver_count”中获取唯一值:

        city    driver_count    type    date    fare    ride_id
0   Kelseyland  63  Urban   2016-08-19 04:27:52 5.51    6246006544795
1   Kelseyland  63  Urban   2016-04-17 06:59:50 5.54    7466473222333
2   Kelseyland  63  Urban   2016-05-04 15:06:07 30.54   2140501382736
3   Kelseyland  63  Urban   2016-01-25 20:44:56 12.08   1896987891309
4   Kelseyland  63  Urban   2016-08-09 18:19:47 17.91   8784212854829
...

应该很简单吧?我只是按“城市”对数据框进行分组,然后使用 pd.unique() 函数得出我唯一的“驱动程序计数”值。

pyber_df_drivers_unique=pyber_df_cities.groupby("city") # Pulls the unique value for the number of drivers in each City
U_pyber_df_drivers = pyber_df_drivers_unique["driver_count"].unique()

>>> city
Alvarezhaven    [21]
Alyssaberg      [67]
Anitamouth      [16]
Antoniomouth    [21]
Aprilchester    [49]
...
    Name: driver_count, dtype: object

这就是我的麻烦开始的地方:我正在创建一个新的数据框来对我所有转换后的属性(其他变量的平均值、计数等)进行分组,以便我可以绘制我的数据。问题是,U_pyber_df_drivers 被归类为对象,而不是整数或数字类型(上面输出中的括号可能也表明了这一点)。

pd.to_numeric:

pd.to_numeric(U_pyber_df_drivers)
>>>
ERROR Invalid object type at position 0

#What's at position 0?
U_pyber_df_drivers[0]
>>>
array([21], dtype=int64)

我不明白这个错误。我尝试过其他方法,例如 df.astype(str)、df.convert_objects(convert_numeric=True)、df.infer_objects(),甚至 pd.factorize()...将我的变量从对象转换为数字类型(我将详细列出所有这些,但鉴于这个错误是一切的开始,我宁愿理解它以避免将来将意大利面扔到墙上)。

【问题讨论】:

  • 我猜U_pyber_df_drivers.str[0] 就足够了
  • 你一定是在开玩笑吧……它成功了,谢谢……但是为什么呢?
  • 我可以解释一下,但首先,我需要知道您的列表中是否存在多个值的可能性?如果是,那么这可能不是一个好的解决方案,因为.str[0] 只会从每个列表中提取第一项。
  • 不,我从主 DataFrame 中提取了“Drivers Count”变量,因此每个“City”(索引)属性只有一个值。
  • 因此我的输出是:“city Alvarezhaven 21 Alyssaberg 67 Anitamouth 16 Antoniomouth 21 Aprilchester 49 (....) Name: driver_count, dtype: int64"

标签: python pandas type-conversion pandas-groupby


【解决方案1】:

@cᴏʟᴅsᴘᴇᴇᴅ 所示,.str[0] 函数从列表中提取第一项,并授予我的数据框只有一个元素,它可以从对象转换为整数(我猜它分配的唯一原因整数作为类型是因为它推断出数组的类型)。

我认为另一种解决方案是在 pd.unique() 函数中传递一个 dtype 参数。如果没有传递任何参数,我认为 pd.unique() 会将每个数值分配为其自己的列表,每个都定义为对象类型,因此我们最终会得到一个嵌入列表中的列表(例如: [ [ 0 ], [ 1 ], [ .. ] ] 而不是预期的 [ 0, 1, ..] )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多