【发布时间】:2020-02-07 21:23:42
【问题描述】:
如果我们初始化一个pandas.DataFrame,其类型将为int64:
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.arange(4).reshape((2,2)), columns=['one','two'])
然后将第一列类型转换为np.str 并查看第二行:
(1)
df2 = df1.astype({'one':np.str})
df2.loc[1,]
df2.loc[1,] 返回一个类型为 object 的 pandas.Series,并保留元素的类型。
但是,如果我们将第二个第一列类型转换为np.float
(2)
df3 = df1.astype({'one':np.float})
df3.loc[1,]
df3.loc[1,] 返回一个类型为float64 的pandas.Series,即'two' 列中的int64 被提升为float64。
有没有办法确保df.loc 始终保留 (1) 中的类型,避免 (2) 中的行为?
(我为什么要关心?因为整数可以作为索引传递,浮点数不能,而且我对必须重铸对象有点恼火,因为熊猫认为我想要的返回值不是我所拥有的最初放入我的数据框中)
【问题讨论】:
-
与
df3.loc[1,]您正在访问第一行,而不是“二”列。您可以看到df3.info()将列two的dtype 保留为int64。 -
@vb_rises,我在
df1中输入了一个“int”,输出来自df3.loc[1,]的浮点数。正如您指出的那样,df3.info() 说那里有一个int,所以当返回值时,某处的类型更改为float。而且我怀疑loc正在这样做,这是我不想要的。 -
您实际期望的输出是什么,您可以发布吗? df.loc() 函数旨在返回一个系列,因此它将转换为可以适合所有值的 dtype。如果您想从每一行访问特定元素,那么您可以执行
df3.loc[1:,'two']并返回 int。这里 1 = 第一行,因此您可以迭代并获取相关元素。
标签: python pandas dataframe slice