【问题标题】:TypeError while converting pandas column to int将熊猫列转换为int时出现TypeError
【发布时间】:2017-08-09 21:12:03
【问题描述】:

使用 pandas 数据框,其中一列,比如 col1 具有浮点值,我试图将这些值中的每一个除以一个预定义的常量,比如 A,然后将结果保存为整数值。

A = 0.5

以下是col1

中的数据
df["col1"]

0     0.800000
1     0.883333
2     0.883333
3     1.000000
4     1.000000
5     1.300000
6     1.300000
7     1.500000
8     1.500000
9     2.000000
10    2.000000
11    2.500000
12    2.500000

申请后

df["new_col"] = (df["col1"] / A)

它给了

0     1.600000
1     1.766667
2     1.766667
3     2.000000
4     2.000000
5     2.600000
6     2.600000
7     3.000000
8     3.000000
9     4.000000
10    4.000000
11    5.000000
12    5.000000

这很好,但是只要我将 .astype(int) 添加到上面的代码中,就可以在 index 9 和 10 观察到值是 3 和 3 而应该分别是 4 和 4。

df["new_col"] = (df["col1"] / A).astype(int)
df["new_col"]

0     1
1     1
2     1
3     2
4     2
5     2
6     2
7     3
8     3
9     3
10    3
11    5
12    5

我试图获得结果的其他方法是

 df["new_col"] = math.floor(df["col1"] / A )

df["new_col"] = int( df["col1"] / A)

这两个都给我 TypeError 说:

TypeError:无法将系列转换为“float”类 TypeError:无法将系列分别转换为“int”类。

请告诉我应该如何解决上述问题。

【问题讨论】:

  • 奇怪。我在这两个地方都得到了 4,4。
  • 我想,我应该重启我的系统再试一次,否则我已经尝试了 10 次代码,它显示了 3 和 3。
  • 这可能是一个浮点问题。如果它表示为 3.99999,则 astype 会将其向下舍入为 3。试试round(0) 可能吗?
  • @ayhan 我按照你的建议做了,使用 .round(0) ,但问题是它作为一个上限函数工作,它使值像 2.6、2.87 到 3,而我希望它们是2. 我还能尝试什么?

标签: python pandas numpy dataframe


【解决方案1】:

您可能有舍入问题。您在内部看到的 4.000000 可能是 3.9999999999,所以您会得到这个结果。 (尝试df.col1-2 进行检查。)

您可以尝试(df.round(6)/.5).astype(int) 处理您看到的数字,但这是一种解决方法。

【讨论】:

  • 如果上列所有的值都是负数,那么如果是-3.999999,会四舍五入为-4?
  • 这样下去很危险。我认为如果你的计算结果是 3.999 而 4 是好的结果,你必须重构这部分。
  • 我仍在为此苦苦挣扎,现在列中的一个值是 -7.680000 并且我将其除以 0.04000 ,它应该是 -192,但我得到 -191 这会影响我的整体结果。请提出你提到的重构部分。很抱歉,之前没有遇到过此类问题,所以没有解决方案。我有一列只有负浮点数,我将用另一个 positive 浮点数除,然后只保留结果的整数部分(如 floor 和 not 天花板)。
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2019-11-02
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多