月份 | 姓名 | 性别 | 应发工资 | 实发工资 | 职位 | |
---|---|---|---|---|---|---|
0 | 1 | 张三 | 男 | 2000 | 1500 | 主犯 |
1 | 2 | 张三 | 男 | 2000 | 1000 | 主犯 |
2 | 3 | 张三 | 女 | 2000 | 15000 | 主犯 |
3 | 4 | 张三 | 女 | 2000 | 1500 | 主犯 |
4 | 5 | 张三 | 女 | 2000 | 1500 | 主犯 |
5 | 2 | 李四 | 男 | 1800 | 1300 | 从犯 |
6 | 3 | 李四 | 男 | 1800 | 1300 | 从犯 |
7 | 4 | 李四 | 男 | 1800 | 1300 | 从犯 |
8 | 5 | 李四 | 男 | 1800 | 1300 | 从犯 |
9 | 1 | 王五 | 女 | 1800 | 1300 | 龙套 |
10 | 2 | 王五 | 女 | 1800 | 1300 | 龙套 |
11 | 3 | 王五 | 女 | 1800 | 1300 | 龙套 |
12 | 4 | 王五 | 女 | 1800 | 1300 | 龙套 |
以上表为例,按照一般的理解,表格一般包含以下属性:
表头:即上表中的 ”月份,姓名,性别,应发工资,实发工资,职位“。
注意,这里第一列的空白处照常而言也是一个表头,不过在Pandas中它有另外的含义。
数据主体:从第二行第一列开始,到右下角的”龙套“,这一块区域全部是表格的数据主体。
索引列:这是Pandas专门设计的一个部分,设置它一方面为了定位方便,另一方面它也有利于复杂表格的操作,今后会讲到。
现在我们先用Pandas录入上述表格数据:
import pandas as pd
df = pd.DataFrame({
'月份': [1,2,3,4,5,2,3,4,5,1,2,3,4],
'姓名':['张三','张三','张三','张三','张三','李四','李四','李四','李四','王五','王五','王五','王五'],
'性别':['男','男','女','女','女','男','男','男','男','女','女','女','女'],
'应发工资':[2000,2000,2000,2000,2000,1800,1800,1800,1800,1800,1800,1800,1800],
'实发工资':[1500,1000,15000,1500,1500,1300,1300,1300,1300,1300,1300,1300,1300],
'职位':['主犯','主犯','主犯','主犯','主犯','从犯','从犯','从犯','从犯','龙套','龙套','龙套','龙套']
})
结果:
df
月份 姓名 性别 应发工资 实发工资 职位
0 1 张三 男 2000 1500 主犯
1 2 张三 男 2000 1000 主犯
2 3 张三 女 2000 15000 主犯
3 4 张三 女 2000 1500 主犯
4 5 张三 女 2000 1500 主犯
5 2 李四 男 1800 1300 从犯
6 3 李四 男 1800 1300 从犯
7 4 李四 男 1800 1300 从犯
8 5 李四 男 1800 1300 从犯
9 1 王五 女 1800 1300 龙套
10 2 王五 女 1800 1300 龙套
11 3 王五 女 1800 1300 龙套
12 4 王五 女 1800 1300 龙套
上述代码的内容很容易理解,首先是将pandas
库导入并将设别名为pd
,其次再是调用DataFrame
的构造函数实例化该对象,并赋值给df
。这里表格的信息我们是采用dict
的格式录入的。
另外观察到另一个问题,在录入数据时并没有提供第一列0,...,12
这些数据,但df
变量就自动有了上述内容。这一列就是表格的索引列。
那么此时再来对照表格认识一下DataFrame
的各个基本属性。
# 表头
df.columns
Index(['月份', '姓名', '性别', '应发工资', '实发工资', '职位'], dtype='object')
# 索引
df.index
RangeIndex(start=0, stop=13, step=1)
# 数据主体
df.values
array([[1, '张三', '男', 2000, 1500, '主犯'],
[2, '张三', '男', 2000, 1000, '主犯'],
[3, '张三', '女', 2000, 15000, '主犯'],
[4, '张三', '女', 2000, 1500, '主犯'],
[5, '张三', '女', 2000, 1500, '主犯'],
[2, '李四', '男', 1800, 1300, '从犯'],
[3, '李四', '男', 1800, 1300, '从犯'],
[4, '李四', '男', 1800, 1300, '从犯'],
[5, '李四', '男', 1800, 1300, '从犯'],
[1, '王五', '女', 1800, 1300, '龙套'],
[2, '王五', '女', 1800, 1300, '龙套'],
[3, '王五', '女', 1800, 1300, '龙套'],
[4, '王五', '女', 1800, 1300, '龙套']], dtype=object)
这里可以看到,表头是Index
类型(Pandas类型),索引列是RangeIndex
类型,values
则是普通的array
类型。前面两个类型在用到的时候我们再介绍,如果好奇的话可以先点击链接自行查看。
接下来再简单查看一下df
中的变量类型:
df.dtypes
月份 int64
姓名 object
性别 object
应发工资 int64
实发工资 int64
职位 object
dtype: object
这里除了各列的类型以外,还包括一个它自己的类型object
。
先看一个例子:
ss=df['姓名']
type(ss)
pandas.core.series.Series
ss
0 张三
1 张三
2 张三
3 张三
4 张三
5 李四
6 李四
7 李四
8 李四
9 王五
10 王五
11 王五
12 王五
Name: 姓名, dtype: object
结合DataFrame
的构造函数的用法其实可以做出合理推测 – 它的索引方式应该和dict
类似。上述代码即证实了这一点,但仔细观察第3-4行,可以看到取出姓名
这一列之后的对象变成了Series
。它是Pandas中另外一个重要的数据结构。
Series
对象的结构实际上与DataFrame
基本一致,唯一不同的在于Series
的数据主体只有一维,而DataFrame
的数据可以有多维。 一种简单的理解方式是:Series
是一个表的一列,同时它带有Index
类型的属性。作为表的一列,它自然也有’表头’,不过此时它不再叫column而是叫name
.
ss.name
'姓名'
自然地,Series
通常也可以直接转换为DataFrame
,如:
ds = pd.DataFrame(ss)
type(ds)
pandas.core.frame.DataFrame
或者直接调用方法:
type(ss.to_frame())
pandas.core.frame.DataFrame
然而,这里需要注意的是,由多个Series
转回DataFrame
时则稍嫌麻烦。可能有同学容易想到以下的方式:
ss1 = df['月份']
ss2 = df['姓名']
pd.DataFrame([ss1,ss2])
0 1 2 3 4 5 6 7 8 9 10 11 12
月份 1 2 3 4 5 2 3 4 5 1 2 3 4
姓名 张三 张三 张三 张三 张三 李四 李四 李四 李四 王五 王五 王五 王五
注意,此时表格没有变成原来的形状,而对应的信息属性其实也发生了变化。”月份“,”姓名“都变成了索引Index
,而上面的数字此时其实仍然是属性。关于这个问题后面讲操作的时候再讨论,这里先直接给出正确的做法:
dd = pd.DataFrame(
{
ss1.name: ss1.values,
ss2.name: ss2.values
}
)
dd
月份 姓名
0 1 张三
1 2 张三
2 3 张三
3 4 张三
4 5 张三
5 2 李四
6 3 李四
7 4 李四
8 5 李四
9 1 王五
10 2 王五
11 3 王五
12 4 王五
这种做法是最为操守的,其思路是利用Series
中对应的信息先构造一个dict
,再利用dict
生成DataFrame
。当然还可以这样做:
dd2 = pd.DataFrame()
dd2[ss1.name] = ss1.values
dd2[ss2.name] = ss2.values
dd2
月份 姓名
0 1 张三
1 2 张三
2 3 张三
3 4 张三
4 5 张三
5 2 李四
6 3 李四
7 4 李四
8 5 李四
9 1 王五
10 2 王五
11 3 王五
12 4 王五
如果熟悉Python的基本数据结构及其操作的情况下,也可以灵活地处理更为复杂的情况,这里不再赘述。
当然还有更多灵活的操作,可以参考相关资料,如:
pandas中Series,DataFrame的连接(拼接)
更多神奇的操作还可以在官方文档中看到:Merge, join, and concatenate
一、Pandas简介与安装
二、Pandas基本数据结构-DataFrame与Series
三、Pandas文件读写
四、Pandas数据索引方式
五、Pandas简单统计操作及通用方式
六、Pandas条件查询
七、Pandas缺失数据的处理(数据清洗基础)
八、Pandas数据透视表
九、表的合并、连接、拼接(数据聚合基础)