python 为什么DataFrame的int列值有时会以float形式返回?

2j4z5cfb  于 2023-01-24  发布在  Python
关注(0)|答案(2)|浏览(416)

我将计算列c添加到仅包含整数的DataFrame中。

df = pd.DataFrame(data=list(zip(*[np.random.randint(1,3,5), np.random.random(5)])), columns=['a', 'b'])
df['c'] = np.ceil(df.a/df.b).astype(int)
df.dtypes

DataFrame报告c的列类型实际上是int

a      int64
b    float64
c      int32
dtype: object

如果我像这样从c中取一个值,那么我会得到一个int:

df.c.values[0]        # Returns "3"
type(df.c.values[0])  # Returns "numpy.int32"

但是如果我使用loc访问相同的值,我会得到一个float:

df.iloc[0].c        # Returns "3.0"
type(df.iloc[0].c)  # Returns "numpy.float64"

这是为什么呢?
我希望能够使用索引访问值,而不必(再次)将其强制转换为int。

dauxcl2d

dauxcl2d1#

看起来,当您访问df.iloc[0].c时,必须首先访问包含所有三列的df.iloc[0]。然后,df.iloc[0]强制转换为表示所有三列的类型,即numpy.float64
有趣的是,我可以通过添加字符串列来避免这种情况。

df = pd.DataFrame(data=list(zip(*[np.random.randint(1,3,5), np.random.random(5)])), columns=['a', 'b'])
df['c'] = np.ceil(df.a/df.b).astype(int)
df['d'] = ['hi', 'bye', 'hello', 'cya', 'sup']

print(df.iloc[0].c)
print(type(df.iloc[0].c))

print(df.dtypes)

对于您的最后一个问题,您可以通过使用df.loc[0, 'c']而不是iloc来避免这种混乱。

import pandas as pd
import numpy as np

df = pd.DataFrame(data=list(zip(*[np.random.randint(1,3,5), np.random.random(5)])), columns=['a', 'b'])
df['c'] = np.ceil(df.a/df.b).astype(int)

print(df.loc[0, 'c'])

print(df.loc[0, 'c'].dtype)
15
int32
bvjveswy

bvjveswy2#

  • 当我执行你的代码时,结果是这个 Dataframe :
df
   a         b   c
0  1  0.315388   4
1  1  0.111275   9
2  1  0.251253   4
3  2  0.043162  47
4  1  0.047985  21
  • 当我输入解释器df['c'].values时,我得到了这个:array([ 4, 9, 4, 47, 21])。这是所有c柱的值。
  • 当我输入解释器df.iloc[0]时,我得到了 Dataframe 的第一行值:
a    1.000000
b    0.315388
c    4.000000
Name: 0, dtype: float64

"我们能注意到的"
所有的c列值都是整数,而所有的第一行值不是相同的类型,因为我们有两个整数和一个浮点值,这个事实非常重要。
实际上,根据定义,数组是a collection of elements of the same type
因此,要表示整数值集合中的浮点数,必须转换为浮点数,以便所有元素都遵守此规则,因为浮点数可以包含整数,但反之则不成立。

结论

整数集合的类型为int...
浮点集合的类型为float...
至少包含一个浮点数的整数集合的类型转换为float...

引用

  • “数组是一个概念,它将相同类型的不同项目存储在一起,并通过向基数添加偏移量,使计算每个元素的立场变得更容易。”(codeinstitute.net)*
    要检查并进一步执行
# case A : value 2 is an integer
mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},]
df = pd.DataFrame(mydict)

df.iloc[0]
a    1
b    2
c    3
d    4
Name: 0, dtype: int64

# case B : value '2' is a string
mydict = [{'a': 1, 'b': '2', 'c': 3, 'd': 4},]
df = pd.DataFrame(mydict)

df.iloc[0]
a    1
b    2
c    3
d    4
Name: 0, dtype: object

在情况A中,所有元素都是整数,因此dtype保持int...
就像B集合包含一个不能是float...的字符串一样,所有元素都被转换为object类型。

相关问题