Pandas系列教程(二)
对于想要入门数据科学的朋友们来说,Python是一个很好的选择,除了因为简单的语法外,Python 生态中提供了很多在数值计算方面非常优秀的库,其中Pandas不可不提,Pandas是很强大是数据集处理工具,往往和numpy, matplotlib 等库搭配使用,我也是刚刚开始学习Pandas, 顺便翻译了一下官方的Pandas教程, 这里使用的是jupyter notebook, 因为博客不支持html直接编辑,所以只能转化为markdown 格式,如果想直接查看html版本可点击每一节下的链接。本文仅供学习和交流使用,欢迎大家交流和指正!
摘要
- 创建数据,使用to_csv()函数生成.txt格式文件,生成1000条随机名字与出生次数的记录
- 获取数据,使用read_csv()函数从.txt文件中读取数据集
- 准备数据(make data clean) 即确保生成的数据集正确无误,主要是检查类型, 如df.info()与df.describe()函数
- 分析数据,主要是排序df.sort_values(),获取最大值df.max(),还有df.head()等函数
- 可视化,这里用.plot.bar()绘制条形图,直观地显示我们的数据
HTML版本点击此处
import pandas as pd
from numpy import random
import matplotlib.pyplot as plt
import sys
import matplotlib
print('Python version ' + sys.version)
print('Pandas version ' + pd.__version__)
print('Matplotlib version ' + matplotlib.__version__)
Python version 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0]
Pandas version 0.23.0
Matplotlib version 2.2.2
"""
创建数据集,数据集的内容依旧是1880年的婴儿名字与出生次数
不同于第一节的是,这里同一个婴儿名字可能出现不止一次,我们可以看做是全国各个
省市分别统计的次数
"""
names = ['Bob','Jessica','Mary','John','Mel']
random.seed(500)
random_names = [names[random.randint(low=0,high=len(names))] for i in range(1000)]
random_names[:10]
['Mary',
'Jessica',
'Jessica',
'Bob',
'Jessica',
'Jessica',
'Jessica',
'Mary',
'Mary',
'Mary']
random_births = [random.randint(low=0,high=1000) for i in range(1000)]
random_births[:10]
[968, 155, 77, 578, 973, 124, 155, 403, 199, 191]
BabyDataSet = list(zip(random_names,random_births))
BabyDataSet[:10]
[('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]
|
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 |
df.to_csv('births1880.txt',index=False,header=False)
Location = 'births1880.txt'
df = pd.read_csv(Location)
df.info()
"""
数据集中有999条记录
列名为Mary的列有999个值
列名为968的列有999个值
两列的类型一个是object,一个是int64
占用的空间大小为: 15.7+ KB
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 999 entries, 0 to 998
Data columns (total 2 columns):
Mary 999 non-null object
968 999 non-null int64
dtypes: int64(1), object(1)
memory usage: 15.7+ KB
'\n数据集中有999条记录\n列名为Mary的列有999个值\n列名为968的列有999个值\n两列的类型一个是object,一个是int64\n占用的空间大小为: 15.7+ KB\n'
df.head()
|
Mary |
968 |
| 0 |
Jessica |
155 |
| 1 |
Jessica |
77 |
| 2 |
Bob |
578 |
| 3 |
Jessica |
973 |
| 4 |
Jessica |
124 |
df = pd.read_csv(Location,header=None)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 2 columns):
0 1000 non-null object
1 1000 non-null int64
dtypes: int64(1), object(1)
memory usage: 15.7+ KB
df.tail()
|
0 |
1 |
| 995 |
John |
151 |
| 996 |
Jessica |
511 |
| 997 |
John |
756 |
| 998 |
Jessica |
294 |
| 999 |
John |
152 |
df = pd.read_csv(Location,names=['Names','Births'])
df.head()
|
Names |
Births |
| 0 |
Mary |
968 |
| 1 |
Jessica |
155 |
| 2 |
Jessica |
77 |
| 3 |
Bob |
578 |
| 4 |
Jessica |
973 |
import os
os.remove(Location)
df['Names'].unique()
array(['Mary', 'Jessica', 'Bob', 'John', 'Mel'], dtype=object)
for name in df['Names'].unique():
print(name)
Mary
Jessica
Bob
John
Mel
df['Names'].describe()
count 1000
unique 5
top Bob
freq 206
Name: Names, dtype: object
name = df.groupby('Names')
name
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x7f3d8b65d8d0>
df = name.sum()
df
|
Births |
| Names |
|
| Bob |
106817 |
| Jessica |
97826 |
| John |
90705 |
| Mary |
99438 |
| Mel |
102319 |
Sorted = df.sort_values(['Births'],ascending=False)
Sorted.head(1)
df['Births'].max()
106817
df['Births'].plot.bar()
print("The most popular name")
df.sort_values(by='Births',ascending=False)
The most popular name
|
Births |
| Names |
|
| Bob |
106817 |
| Mel |
102319 |
| Mary |
99438 |
| Jessica |
97826 |
| John |
90705 |
