这里是新手入门教程,讲的啰嗦,高手及受不了的劝退。
Pandas是一个杰作,其创作团队将现实的事物抽象成DataFrame和一系列相关操作,是一个完整的体系。我们学习的pandas的本质其实在学习其体系结构,理顺了作者的思路,就能得心应手。古语曰:学而不思则罔,思而不学则殆;我补一句:学而不习则忘;希望大家在学习Pandas过程中,掌握其底层逻辑,将之纳入自己思维体系。
一般来说,一款成熟的软件处处透漏着规范,如函数命名、参数位置等等,而且这种规范在软件间大部分情况下是通用的,一通百通,触类旁通,也算是各种隐藏彩蛋,祝各位收货颇丰。
Series 是DataFrame 的单列的数据结构,不仅在概念上,而且在字面上,即DataFrame中的数据实际上作为Series的集合存储在内存中。
类似地:我们需要列表和矩阵,因为矩阵是用列表构建的。单行矩阵,虽然在功能上等同于列表,但如果没有它们组成的列表,仍然无法存在。
它们都有极其相似的 API,但您会发现DataFrame方法总是迎合您拥有多个列的可能性。当然,您始终可以将另一个Series(或等效对象)添加到DataFrame,而将Series添加到另一个Series涉及创建DataFrame。
DataFrame是也可以说是一种多列Serise。
DataFrame是一种定制的结构,其列是Serise对象,所以列赋值的本质是:将新列的值转为Serise对象,传给DataFrame注册为其列。如果你付新值时给的就是Serise对象,就免去转换这步了。
单列赋值是传一下Serise给DataFrame,多列即是传多个Serise。
多列赋值,有三种方法,如下:
List对象一般下默认转为一个多列Serise对象,但是转化时,只会涉及到第二层,不会涉及多层。如下:
import pandas as pd
df = pd.DataFrame([1,2,3], columns=['a'])
# 多层嵌套的list实例
nested_list = [[[1], [3]], [[22], [33]], [[134], [332]]]
# 赋值
df.loc[:, 'nested'] = nested_list
df
a nested
0 1 [[1], [3]]
1 2 [[22], [33]]
2 3 [[134], [332]]
默认情况DataFrame的apply操作结果为单列Serise对象(其他类似函数也是如此),只能进行单列赋值,需要先变成多列的Serise再赋值,如下:
import pandas as pd
df = pd.DataFrame([1,2,3], columns=['a'])
def double(row):
e = row.a
return e, e
# 对应结果1 Serise对象
df.apply(double, axis=1)
# 多列赋值失败会报错 ValueError: Must have equal len keys and value when setting with an
df.loc[:, ['double_1', "double_2"]] = df.apply(double, axis=1)
# 对应结果2
df.apply(double, axis=1, result_type='extand')
# 多列赋值成功
df.loc[:, ['double_1', "double_2"]] = df.apply(double, axis=1, result_type='expand')
out1:
0 (1, 1)
1 (2, 2)
2 (3, 3)
dtype: object
out2: 是一个DataFrame 可以多列赋值
0 1
0 1 1
1 2 2
2 3 3
Serise的apply为Serise对象,无法多列赋值,需要先to_list再赋值。
def double_a(e):
return e, e
df.loc[:, ['double_1', "double_2"]] = df.a.apply(double_a).to_list()