我将计算列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。
2条答案
按热度按时间dauxcl2d1#
看起来,当您访问
df.iloc[0].c
时,必须首先访问包含所有三列的df.iloc[0]
。然后,df.iloc[0]
强制转换为表示所有三列的类型,即numpy.float64
。有趣的是,我可以通过添加字符串列来避免这种情况。
对于您的最后一个问题,您可以通过使用
df.loc[0, 'c']
而不是iloc
来避免这种混乱。bvjveswy2#
df['c'].values
时,我得到了这个:array([ 4, 9, 4, 47, 21])
。这是所有c柱的值。df.iloc[0]
时,我得到了 Dataframe 的第一行值:"我们能注意到的"
所有的c列值都是整数,而所有的第一行值不是相同的类型,因为我们有两个整数和一个浮点值,这个事实非常重要。
实际上,根据定义,数组是
a collection of elements of the same type
。因此,要表示整数值集合中的浮点数,必须转换为浮点数,以便所有元素都遵守此规则,因为浮点数可以包含整数,但反之则不成立。
结论
整数集合的类型为
int...
浮点集合的类型为
float...
至少包含一个浮点数的整数集合的类型转换为
float...
引用
要检查并进一步执行
在情况A中,所有元素都是整数,因此dtype保持
int...
。就像B集合包含一个不能是
float...
的字符串一样,所有元素都被转换为object
类型。