一、创建Series对象
官网链接:
https://pandas.pydata.org/docs/reference/api/pandas.Series.html
data可以是类数组、可迭代、字典或者标量值
标量值(Scalar)是数据结构中最基础、不可再分的单一数据元素,它只包含一个数值(如数字、字符或布尔值),没有方向或内部结构。
(1)如果用字典,字典的键就是行索引
d={'a':1,'b':2,'c':3}ser=pd.Series(data=d)print(ser)
(2)如果不用字典的键,重新定义index,则用重新定义的索引,但结果全是NaN
Note that the Index is first build with the keys from the dictionary.
After this the Series is reindexed with the given Index values, hence we get all NaN as a result
d={'a':1,'b':2,'c':3}ser=pd.Series(data=d,index=['x','y','z'])print(ser)
(3)使用数组
r=[1,2]ser=pd.Series(r,copy=False)
Q:copy = False在这里什么作用?
官网说:
Due to input data type the Series has a copy of the original data even though copy=False, so the data is unchanged.
尽管copy为False(不拷贝),原数据不受影响
copy=False 的生效前提:输入数据是 “可直接复用的同构数组”
Q:ndarray-like数据是什么意思?
A:ndarray-like(类 ndarray)数据 是一个通用术语,指可以被安全地转换为 NumPy 多维数组(ndarray)的对象,其核心特征是支持被 np.asarray() 或 np.array() 函数转换为标准 ndarray,且转换过程是高效、无歧义的。
Q:可以被转为ndarray的数据类型有哪些?
A:
一、内置基础类型
注意:
- 单个字符串会被转换为0 维数组或字符数组(取决于 NumPy 版本);
- 长度不一致的字符串序列(如 [“a”, “abc”])会被转换为 object 类型数组(存储字符串对象引用)。
二、内置容器类型
关键:
- 字典直接转换无实际数值意义,通常会用 np.array(list(dict.keys())) 或 np.array(list(dict.values())) 提取键 / 值转换。
三、NumPy 及科学计算库的数组 / 类数组类型
这类类型本身就是为数值计算设计的,转换时高效且无数据丢失,也是 Pandas 中 copy=False 生效的核心场景。
总计:只要是能被 NumPy 解析为 “数据集合” 的对象,都能转换为 ndarray,但只有同构的数值 / 布尔序列转换后才有实际的数值计算价值
Q:所以用列表创建Series对象会发生什么?
A:Pandas的Series底层依赖NumPy数组存储数据(这是 Pandas 高效计算的基础),而要将列表转换为 Series,必须先把列表中的元素提取出来,构建一个新的 NumPy 数组。这个列表 → NumPy 数组的转换过程是强制的,无论 copy 参数如何设置,都需要创建新的内存块来存储数值,因此必然产生数据副本。
Q:数据副本?
A:数据副本(Copy) 指的是在内存中创建一份与原始数据完全独立的新数据—— 副本和原数据占据不同的内存地址,修改副本的内容不会影响原始数据,反之亦然。与之相对的是视图(View)(或引用),视图只是对原始数据的另一个 “访问窗口”,共享同一块内存,修改视图会直接反映到原始数据上。
# 输入是列表(会复制)r_list=[1,2]ser_list=pd.Series(r_list,copy=False)r_list[0]=100print(r_list)print(ser_list)# 列表被修改,Series对象不被修改ser_list.loc[0,0]='修改'print(r_list)# Series对象修改,原列表不被修改print(ser_list)Q:写不写copy,用列表创建,效果一样的呀?不是说列表被转为numpy数组了吗?copy对numpy数组是起作用的呀?
A:效果一致,因为列表转为numpy数组的过程中,会创建原始列表数据的副本,修改原列表不会影响 Series,修改 Series 也不会影响原列表。但这并不意味着 copy 参数完全无意义,而是其作用被列表到 NumPy 数组的强制转换过程覆盖了。copy对numpy数组起作用:
只是,针对最终的 “Series 与原列表的关系” 来说,这两种情况的结果是一样的:Series 的数据和原列表完全独立
(4)使用numpy数组创建Series对象
# 输入是NumPy数组(copy=False生效,复用内存)r_np=np.array([1,2])ser_np=pd.Series(r_np,copy=False)r_np[0]=100print(ser_np)# 输出:0 100\n1 2(原数组修改影响Series)如果传入的数据不停变化,想两边同步,可以copy=False(我改你也改)
如果不想同步,想分开,copy=True
默认,copy = False
二、numpy
(一)了解
- NumPy(Numerical Python)是 Python 中用于科学计算的核心库,专门为大规模数值数组处理和高效数学运算设计。它的核心是提供了多维数组对象(ndarray),并配套了大量优化的数学函数(如线性代数、傅里叶变换、随机数生成等),解决了 Python 原生列表在数值计算中效率低下的问题。
- Python 原生列表:适合通用的、异构的元素存储(如[1, “a”, True]),但数值计算慢、内存利用率低。NumPy 的 ndarray:专为同构数值数据设计,是实现高效数值计算的基础,也是Pandas、Matplotlib、SciPy 等数据分析库的底层依赖。
- NumPy 数组(ndarray)的连续存储,指的是数组的元素在内存中占据一块连续的、固定大小的内存区域,这是它与 Python 原生列表最核心的区别之一。
(二)对比
- Python 的列表(list)是异构可变容器,其存储方式是“引用存储”(也叫 “指针存储”)
- 列表本身只存储一系列指向实际元素的引用(指针),这些引用在内存中是连续的,但实际的元素可能分散在内存的不同位置。
- Python 原生列表:适合通用的、异构的元素存储(如[1, “a”, True]),但数值计算慢、内存利用率低
普通数据结构(列表)是引用,修改后原数据不一定变;而 NumPy 的视图修改会影响原数据
核心:看修改的是‘引用指向’还是‘内存中的数值本身’”,以及“是否共享同一块内存区域”(具体情况具体分析)
三、创建DataFrame
参考例子:
(1)字典创建
d={'col1':[1,2],'col2':[3,4]}df=pd.DataFrame(data=d)print(df)(2)根据Series对象创建
ser=pd.Series([1,2,3],index=["a","b","c"])df=pd.DataFrame(data=ser,index=["a","c"])print(df)
(3)传入数据,指定行索引,列索引
df=pd.DataFrame([1,2,3],index=["a","b","c"],columns=["x"])print(df)