Pandas简明教程:二、Pandas基本数据结构-DataFrame与Series

1、什么是表格?
月份姓名性别应发工资实发工资职位
01张三20001500主犯
12张三20001000主犯
23张三200015000主犯
34张三20001500主犯
45张三20001500主犯
52李四18001300从犯
63李四18001300从犯
74李四18001300从犯
85李四18001300从犯
91王五18001300龙套
102王五18001300龙套
113王五18001300龙套
124王五18001300龙套

以上表为例,按照一般的理解,表格一般包含以下属性:

  • 表头:即上表中的 ”月份,姓名,性别,应发工资,实发工资,职位“。

    注意,这里第一列的空白处照常而言也是一个表头,不过在Pandas中它有另外的含义。

  • 数据主体:从第二行第一列开始,到右下角的”龙套“,这一块区域全部是表格的数据主体。

    • 表格行与列:行与列是包含在数据主体中的部分。
  • 索引列:这是Pandas专门设计的一个部分,设置它一方面为了定位方便,另一方面它也有利于复杂表格的操作,今后会讲到。

2、DataFrame类型

现在我们先用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

3、Series类型

先看一个例子:

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数据透视表

九、表的合并、连接、拼接(数据聚合基础)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值