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")

Python 学习Pandas, 第 1、2课
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