据我所知,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?
答案 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