如果Pandas系列使用numpy,我如何在Pandas系列中使用不同的类型?

时间:2018-09-01 15:54:04

标签: python pandas numpy

据我所知,numpys ndarrays元素必须具有相同的类型,而pandas系列使用ndarray来保存值。但是好像我能够将一个整数附加到持有字符串的Series上。

我有示例代码。

import pandas as pd

sr = pd.Series(['foo'])
sr = sr.append(pd.Series([1], index=[1]))
print(type(sr.values))
print(sr.values.dtype)
print(type(sr.iloc[0]))
print(type(sr.iloc[1]))

和输出:

<class 'numpy.ndarray'>
object
<class 'str'>
<class 'int'>

如果ndarrays类型是object,那么索引loc 1处的项如何返回int?

1 个答案:

答案 0 :(得分:1)

object dtype系列由指向任意Python对象的指针组成。以与Python列表相同的方式考虑object dtype。例如,Python列表['foo', 1]不在连续的内存块中存储值。

以同样的方式,您无法将特定的数据类型附加到list,即使所有元素都属于同一类型,Pandas object系列也包含指针任意数量的类型。

通常,Pandas dtype会更改为容纳值。因此,将浮点值添加到整数序列会将整个序列变成float。在数字序列中添加字符串会强制将序列设置为object。您甚至可以强制数字系列具有object dtype,尽管不建议这样做:

s = pd.Series(list(range(100000)), dtype=object)

一旦您开始使用object系列,就会失去Pandas的主要好处,即矢量化计算。尽可能避免。例如,您可以使用pd.Categorical分解类别(如果适用)。

这是一个演示性能下降的简单示例:

t = pd.Series(list(range(100000)))

%timeit s*10  # 7.31 ms
%timeit t*10  # 366 µs

相关:Strings in a DataFrame, but dtype is object