Python 学习Pandas, 第 1、2课
关注微信公共号:小程在线
关注CSDN博客:程志伟的博客
完整脚本在公共号
学习Pandas, 第 1课
Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.
IPython 7.12.0 -- An enhanced Interactive Python.
from pandas import DataFrame, read_csv
# 导入一个库的一般做法:
##import (library) as (give the library a nickname/alias)
import matplotlib.pyplot as plt
import pandas as pd #导入pandas的常规做法
import sys #导入sys库只是为了确认一下Python的版本
import matplotlib #这样导入matplotlib只是为了显示一下其版本号
print('Python version ' + sys.version)
print('Pandas version ' + pd.__version__)
print('Matplotlib version ' + matplotlib.__version__)
Python version 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Pandas version 1.0.1
Matplotlib version 3.1.3
创建数据
这个简单的数据集包括了: 1880年出生的, 5个常用的婴儿的名字, 以及对应的婴儿数量。
names = ['Bob','Jessica','Mary','John','Mel']
births = [968, 155, 77, 578, 973]
用 zip 函数将这两个列表合并在一起。
BabyDataSet = list(zip(names, births))
BabyDataSet
Out[4]: [('Bob', 968), ('Jessica', 155), ('Mary', 77), ('John', 578), ('Mel', 973)]
我们已经完成了一个基本的数据集的创建。 我们现在用 pandas 将这些数据导出到一个 csv 文件中。
df 是一个 DataFrame对象。 你可以把这个对象理解为包含了 BabyDataset 的内容而格式非常象一个 sql 表格或者 Excel 的数据表。
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
df
Out[5]:
Names Births
0 Bob 968
1 Jessica 155
2 Mary 77
3 John 578
4 Mel 973
将 dataframe 导出到一个 csv 文件中
df.to_csv('births1880.csv', index=False, header=False)
获取数据
我们将使用 pandas 的 read_csv 函数从 csv 文件中获取数据。
Location = r'./births1880.csv' #从 notebook 当前的位置读取 csv 文件
df = pd.read_csv(Location)
df
Out[8]:
Bob 968
0 Jessica 155
1 Mary 77
2 John 578
3 Mel 973
要修正这个错误, 我们需要给 read_csv 函数传入 header 这个参数, 并设置为None (Python中 null 的意思)。
df = pd.read_csv(Location, header=None)
df
Out[9]:
0 1
0 Bob 968
1 Jessica 155
2 Mary 77
3 John 578
4 Mel 973
如果我们需要为每一列指定一个名字, 我们可以传入另外一个参数 names, 同时去掉 header 这个参数
df = pd.read_csv(Location, names=['Names', 'Births'])
df
Out[10]:
Names Births
0 Bob 968
1 Jessica 155
2 Mary 77
3 John 578
4 Mel 973
Location = r'./yob1880.txt'
df = pd.read_csv(Location)
df
Out[11]:
Mary F 7065
0 Anna F 2604
1 Emma F 2003
2 Elizabeth F 1939
3 Minnie F 1746
4 Margaret F 1578
... .. ...
1994 Woodie M 5
1995 Worthy M 5
1996 Wright M 5
1997 York M 5
1998 Zachariah M 5
[1999 rows x 3 columns]
df = pd.read_csv(Location, header=None)
df
Out[12]:
0 1 2
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
... .. ...
1995 Woodie M 5
1996 Worthy M 5
1997 Wright M 5
1998 York M 5
1999 Zachariah M 5
[2000 rows x 3 columns]
df = pd.read_csv(Location, names=['Names','sex','Births'])
df
Out[13]:
Names sex Births
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
... .. ...
1995 Woodie M 5
1996 Worthy M 5
1997 Wright M 5
1998 York M 5
1999 Zachariah M 5
[2000 rows x 3 columns]
# 查看每一列的数据类型
df.dtypes
Out[14]:
Names object
sex object
Births int64
dtype: object
# 查看 Births 列的数据类型
df.Births.dtype
Out[15]: dtype('int64')
分析数据
要找到最高出生率的婴儿名或者是最热门的婴儿名字, 我们可以这么做。
将 dataframe 排序并且找到第一行
使用 max() 属性找到最大值
Sorted = df.sort_values(['Births'], ascending=False)
Sorted.head(1)
Out[16]:
Names sex Births
942 John M 9655
df['Births'].max()
Out[17]: 9655
[df['Births'] == df['Births'].max()]
df['Names'][df['Births'] == df['Births'].max()]
Out[18]:
942 John
Name: Names, dtype: object
学习Pandas, 第 2 课
import pandas as pd
from numpy import random
import matplotlib.pyplot as plt
import sys #导入sys库只是为了确认一下Python的版本
import matplotlib #这样导入matplotlib只是为了显示一下其版本号
创建数据
# 婴儿名字的初始值
names = ['Bob','Jessica','Mary','John','Mel']
使用上面的5个名字来创建一个有1,000个婴儿名字的随机列表, 我们要做如下一些操作:
生成一个 0 到 4 之间的随机数
seed(500) - 创建一个种子
randint(low=0, high=len(names)) - 生成一个随机整数, 介于 0 和 "names" 列表的长度之间。
names[n] - 从 "names" 列表中选择索引值(index)为 n 的名字。
for i in range(n) - 循环直到 i 等于 n, 即: 1,2,3,....n。
random_names = 从 names 列表中选在一个随机名字并执行 n 次 (Select arandom name from the name list and do this n times.)
andom.seed(500)
random_names = [names[random.randint(low=0,high=len(names))] for
i in range(1000)]
random_names[:10]
Out[30]:
['Mary',
'Jessica',
'Jessica',
'Bob',
'Jessica',
'Jessica',
'Jessica',
'Mary',
'Mary',
'Mary']生成介于 0 和 1000 之间的随机数
births = [random.randint(low=0,high=1000) for i in range(1000)]
births[:10]
Out[31]: [968, 155, 77, 578, 973, 124, 155, 403, 199, 191]
用 zip 函数把 names 和 births 这两个数据集合并在一起。
BabyDataSet = list(zip(random_names,births))
BabyDataSet[:10]
Out[32]:
[('Mary', 968),
('Jessica', 155),
('Jessica', 77),
('Bob', 578),
('Jessica', 973),
('Jessica', 124),
('Jessica', 155),
('Mary', 403),
('Mary', 199),
('Mary', 191)]
df = pd.DataFrame(data = BabyDataSet, columns=['Names', 'Births'])
df[:10]
Out[33]:
Names Births
0 Mary 968
1 Jessica 155
2 Jessica 77
3 Bob 578
4 Jessica 973
5 Jessica 124
6 Jessica 155
7 Mary 403
8 Mary 199
9 Mary 191
汇总信息:
数据集里有 999 条记录
有一列 Mary 有 999 个值
有一列 968 有 999 个值
这两列, 一个是numeric(数字型), 另外一个是non numeric(非数字型)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Names 1000 non-null object
1 Births 1000 non-null int64
dtypes: int64(1), object(1)
memory usage: 15.8+ KB
df.head()
Out[35]:
Names Births
0 Mary 968
1 Jessica 155
2 Jessica 77
3 Bob 578
4 Jessica 973
看一下这个 dataframe 的最后 5 条记录。
df.tail()
Out[36]:
Names Births
995 John 151
996 Jessica 511
997 John 756
998 Jessica 294
999 John 152
准备数据
使用 dataframe 的 unique 属性找出 "Names" 列的所有唯一的(unique)的记录。
df['Names'].unique()
Out[37]: array(['Mary', 'Jessica', 'Bob', 'John', 'Mel'], dtype=object)
# 方法 1:
for x in df['Names'].unique():
print(x)
Mary
Jessica
Bob
John
Mel
# 方法 2:
print(df['Names'].describe())
count 1000
unique 5
top Bob
freq 206
Name: Names, dtype: object
# 创建一个 groupby 的对象
name = df.groupby('Names')
# 在 groupby 对象上执行求和(sum)的功能
df = name.sum()
df
Out[40]:
Births
Names
Bob 106817
Jessica 97826
John 90705
Mary 99438
Mel 102319
分析数据
要找到最高出生率的婴儿名或者是最热门的婴儿名字, 我们可以这么做。
将 dataframe 排序并且找到第一行
使用 max() 属性找到最大值
# 方法 1:
Sorted = df.sort_values(['Births'], ascending=False)
Sorted.head(1)
Out[41]:
Births
Names
Bob 106817
# 方法 2:
df['Births'].max()
Out[42]: 106817
表现数据
我们可以将 Births 这一列标记在图形上向用户展示数值最大的点。 对照数据表,
用户就会有一个非常直观的画面 Bob 是这组数据中最热门的婴儿名字。
df['Births'].plot.bar()
print("The most popular name")
df.sort_values(by='Births', ascending=False)
The most popular name
Out[43]:
Births
Names
Bob 106817
Mel 102319
Mary 99438
Jessica 97826
John 90705