pandas是在数据处理、数据分析以及数据可视化上都有比较多的应用,这篇文章就来介绍一下pandas的入门。劳动节必须得劳动劳动
1. 基础用法
以下代码在jupyter中运行,Python 版本3.6。首先导入 pandas
import pandas
as pd
# 为了能在jupyter中展示图表
%matplotlib inline
# 从csv文件读取数据,也可从excel、json文件中读取
# 也可以通过sql从数据库读数据
data = pd.read_csv(
'order_list.csv')
# 输出几行几列
data.shape
output:
(
1000,
3)
可以看到,变量 data 是一个二维表,有1000行,3列。pandas中这种数据类型被称作 DataFrame。
# 查看数据描述
data.describe()

data 中有3列,good_id、good_cnt 和 order_id 分别代表商品id、购买该商品数量和订单id。最左侧是describe函数统计的指标,包括每一列的数量、均值、标准差、最大值、最小值等等。
# 预览数据,条数可设
data.head(
3)

# 获取第2行数据
data.loc[
2]
output:
good_id
100042
good_cnt
1
order_id
10000002
Name:
2, dtype: int64
# 获取多行数据,数组元素代表行号
data.loc[[
1,
2]]

# 获取商品id=100012的所有记录
data[data[
'good_id']==
100012]

# 获取商品id=100012且每笔订单销量=6的所有记录
data[(data[
'good_id']==
100087) & (data[
'good_cnt']==
6)]

# 获取订单号在[10000000, 10000042]中的记录
data[data[
'order_id'].isin([
10000000,
10000042])]

# 画100012商品,每笔订单销量折线图
data[data[
'good_id']==
100012][
'good_cnt'].plot()

# 画100012商品,销量柱状图
data[data[
'good_id']==
100012][
'good_cnt'].hist()

# 更新数据,将第1行的good_cnt列改为10
data.loc[
1,
'good_cnt'] =
10
data.head(
3)

# 将100012商品每笔订单销量都改为20
data.loc[data[
'good_id']==
100012,
'good_cnt'] =
20
data.head(
3)

2. 中级用法
# 统计每种商品出现次数
# 即:每种商品的下单次数
data[
'good_id'].value_counts()
output:
100080 18
100010 16
100073 16
100097 15
100096 15
..
100079
5
100077
5
100007
4
100037
4
100033
4
Name: good_id, Length:
100, dtype: int64
# 取出商品销量列,该列中每个值都加1
data[
'good_cnt'].map(
lambda x: x+
1)
output:
0
21
1
11
2
2
3
4
4
10
..
995
8
996
9
997
6
998
5
999
9
Name: good_cnt, Length:
1000, dtype: int64
这里,map并不改变原有的 data 中的数据,而是返回新的对象。
# 对数据集每列调用给定的函数
data.apply(len)
这里是对每列执行len函数,当然apply中的len函数也可以换成自定义的 lambda 表达式。另外,如果想按行做处理,则在调用apply函数时加上axis=1参数即可。
# 对数据集中所有元素调用给定函数
# 同样不改变原有数据集
data.applymap(
lambda x: x*
100)
# 计算每列之间的相关系数
data.corr()

# 画出相关系数矩阵
pd.plotting.scatter_matrix(data, figsize=(
12,
8))

以左小角为例,它表示商品id(good_id)和订单id(order_id)之间的相关性。由于点比较分散,没有任何规律,因此可以说明这两列在数据值上没有相关性,这也好理解,因为本来它俩就是不同的概念。
相关系数矩阵一般用于机器学习中观察不同特征之间的相关性。
3. 高级用法
实现SQL join操作
# 构造DateFrame,代表订单发生的城市
order_city_df = pd.DataFrame(\
dict(order_id=[
10000000,
10000001], \
city=[
'上海',
'北京'])\
)
# 实现join
data.merge(order_city_df, on=[
'order_id'])

实现SQL group by操作
# 统计每个商品的总销量
data.groupby(
'good_id')[
'good_cnt'].sum().reset_index()

遍历 DataFrame 中每行数据
dictionary = {}
for i,row
in data.iterrows():
dictionary[row[
'good_id']] = row[
'good_cnt']
pandas的入门就介绍到这里,希望能对你有帮助。对于想继续深入的朋友可以参考pandas官方文档,中英文都有。另外,我们使用pandas一般都是单机来处理,如果数据量比较大,单机运行起来会比较慢。这时候你可能会用到另外一个工具叫 Dask,它的接口兼容 pandas,可以与pandas相互转换,并且可以运行在集群上分布式处理数据。
如需完整代码,在公众号回复关键字 pd 即可