将Pandas浮点数列转换为整数

7

我正在为一个学生离散化我的系列。我确实需要该系列是float类型,并且我真的需要避免使用for循环。

如何将此系列从float转换为int?

以下是我当前失败的函数:

def discretize_series(s,count,normalized=True):
    def discretize(value,bucket_size):
        return value % bucket_size
    if normalized:
        maximum = 1.0
    else:
        minimum = np.min(s)
        s = s[:] - minimum
        maximum = np.max(s)
    bucket_size = maximum / float(count)

这是导致函数失败的行:

    s = int((s[:] - s[:] % bucket_size)/bucket_size)

int()引起了强制转换错误:我无法将pandas系列转换为int系列。

    return s

如果我去掉 int(),这个函数就可以工作了,所以我要试着看能不能让它正常工作。

在第一个分支中,最小值大于零,因此从所有值中减去它将最小值设置为零。在第二个分支中,最小值小于零,因此添加 abs(min) 将数据向上移动到零... - Chris
除非“pandas”出了什么问题,否则您可能不需要那些“[:]”。 - Andras Deak -- Слава Україні
“is currently failing” 是什么意思?它只在 normalized==True 的情况下失败吗?如果是这种情况,您可能需要设置 s=s/np.max(s)。如果 np.max(s)<0,您仍然可能会遇到问题。这种情况可能发生吗? - Andras Deak -- Слава Україні
不行,因为第11行的int()函数导致失败。它无法将序列从浮点数转换为整数。 - Chris
那么,如果您的输入序列最大值为10,您确定它对于“normalized==True”情况下的工作是正确的吗?例如,对于计数2,您将具有0.5的bucket_size。但是,对于s的最大值,您将具有(10-10%0.5)/ 0.5 == 20,比2多得多。我希望您必须进行相同的移位到0,但您还必须除以最大值。 - Andras Deak -- Слава Україні
显示剩余3条评论
2个回答

22

普通的 Python int 函数只适用于标量。您应该使用 NumPy 函数来舍入数据,例如:

s = np.round((s - s % bucket_size) / bucket_size) #to round properly; or
s = np.fix((s - s % bucket_size) / bucket_size)   #to round towards 0

如果您确实想将其转换为整数类型,请使用

s = s.astype(int)

投射您的数组。


1

注意:从效率角度来看,这个答案不如使用 numpy 更高效。如果追求效率,请考虑使用 numpy

至于这个答案,使用 pandas 数据框架进行了大量工作,因此添加额外的转换到 numpy 意味着编写额外的代码。所以,如果在例如 jupyter notebook 中进行分析,我们可以让编程语言在幕后做一些工作。

非常感谢 @Chris 注意到这一点。


pandas 版本(理论上比 numpy 不那么高效)

创建一个包含浮点值的列表:

y = [0.1234, 0.6789, 0.5678]

将浮点数列表转换为 pandas Series

s = pd.Series(data=y)

将数值四舍五入到三位小数

print(s.round(3))

返回

0    0.123
1    0.679
2    0.568
dtype: float64

转换为整数

print(s.astype(int))

返回值

0    0
1    0
2    0
dtype: int64

管道化一切

pd.Series(data=y).round(3)

不确定这是否回答了问题。可能情况是pandas库正在使用numpy调用来实现此接口。 - Chris
@Chris,感谢您的评论,快速进行网络搜索后发现您是正确的: ... pandas 是一个开源库,建立在 numpy 之上,为 Python 编程语言提供高性能、易于使用的数据结构和数据分析工具...对于 numpy 的要求很少,但我们可以删除它,请告诉我何时为时已晚。 - Curious Watcher
没有问题,其实这对我无所谓。这是一个写得很好的答案。只是说接受的答案会保留下来,因为它回答了一个更基础的问题。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接