从pandas
{.loc
或.iloc
)提取单个行,产生pandas
{DataFrame
中的异构数据时(即DataFrame
的列不都是相同的数据类型),这会导致行中不同列的所有值强制为单个数据类型,因为Series
只能有一个数据类型。下面是一个简单的例子来说明我的意思:
import numpy
import pandas
a = numpy.arange(5, dtype='i8')
b = numpy.arange(5, dtype='u8')**2
c = numpy.arange(5, dtype='f8')**3
df = pandas.DataFrame({'a': a, 'b': b, 'c': c})
df.dtypes
# a int64
# b uint64
# c float64
# dtype: object
df
# a b c
# 0 0 0 0.0
# 1 1 1 1.0
# 2 2 4 8.0
# 3 3 9 27.0
# 4 4 16 64.0
df.loc[2]
# a 2.0
# b 4.0
# c 8.0
# Name: 2, dtype: float64
df.loc[2]
中的所有值都已转换为float64
有没有一种不进行这种类型转换就提取行的好方法?例如,我可以想象返回一个^{
另一种方法(但感觉有点粗糙):
您可以使用长度为1的切片器,而不是使用带有
loc
或iloc
的整数。这将返回长度为1的数据帧,因此iloc[0]
包含您的数据。e、 g对我来说,这比两次转换数据类型(一次在行提取期间,一次之后)更为可取,并且比多次使用相同的行规范引用原始数据帧更为清晰(这在计算上可能非常昂贵)
我认为如果pandas有一个DataFrameRow类型用于此变量会更好
正如您已经意识到的,series不允许混合
dtypes
。但是,如果将其数据类型指定为object
,则它允许混合数据类型。因此,您可以将数据帧的数据类型转换为object
。每个列都将在数据类型object
中,但每个值仍将其数据类型保持为int
和float
否则,您需要将dataframe转换为
np.recarray
相关问题 更多 >
编程相关推荐