Pandas模块 04

<title>test_pandas</title>




<body> <div tabindex="-1" id="notebook" class="border-box-sizing"> <div class="container" id="notebook-container">
In [6]:
import numpy as np

为啥使用numpy

计算购物车的总价格

In [15]:
l1=[2,3,10,5]
l2=[10,200,150,50]

In [8]:
l1_np = np.array(l1)
l2_np = np.array(l2)

In [9]:
l1_np

Out[9]:

array([ 2,  3, 10,  5])
In [10]:
l2_np

Out[10]:

array([ 10, 200, 150,  50])
In [11]:
l1_np * l2_np

Out[11]:

array([  20,  600, 1500,  250])
In [13]:
np.sum(l1_np * l2_np)

Out[13]:

2370
In [14]:
import numpy as np
import pandas as pd

Series的学习

Series的创建方法

In [17]:
s1 = pd.Series([2,3,4,5,6])

In [18]:
s1

Out[18]:

0    2
1    3
2    4
3    5
4    6
dtype: int64
In [19]:
s2 = pd.Series([2,3,4,5,6],index=['a','b','c','d','e'])

In [20]:
s2

Out[20]:

a    2
b    3
c    4
d    5
e    6
dtype: int64

索引取值

In [21]:
s1[1]

Out[21]:

3
In [22]:
s2['b']

Out[22]:

3
In [23]:
s2[1]  ##### 数字型索引和自定义索引是共存的

Out[23]:

3
In [24]:
s4 = pd.Series(0,index=['a','b','c'])
s4

Out[24]:

a    0
b    0
c    0
dtype: int64

Series的特性

In [26]:
s1 * 2   #### 矢量运算

Out[26]:

0     4
1     6
2     8
3    10
4    12
dtype: int64
In [28]:
s3 = pd.Series([2,3,4,5,6])
s3

Out[28]:

0    2
1    3
2    4
3    5
4    6
dtype: int64
In [29]:
s1 * s3

Out[29]:

0     4
1     9
2    16
3    25
4    36
dtype: int64
In [30]:
s1>4

Out[30]:

0    False
1    False
2    False
3     True
4     True
dtype: bool
In [31]:
s1[s1>4]  #### 布尔型索引

Out[31]:

3    5
4    6
dtype: int64
In [32]:
abs(s1)

Out[32]:

0    2
1    3
2    4
3    5
4    6
dtype: int64
In [34]:
sum(s1)  #### 求和

Out[34]:

20

缺失值处理

In [35]:
st = pd.Series({'sean':12, 'yang':15, 'cloud':20, 'bella':23})  #### 放字典也可以
st

Out[35]:

sean     12
yang     15
cloud    20
bella    23
dtype: int64
In [37]:
obj1 = pd.Series(st, index=['sean', 'yang', 'cloud'])
obj1

Out[37]:

sean     12
yang     15
cloud    20
dtype: int64
In [39]:
obj2 = pd.Series(st, index=['sean', 'yang', 'cloud', 'rocky'])
obj2

Out[39]:

sean     12.0
yang     15.0
cloud    20.0
rocky     NaN
dtype: float64
In [41]:
#### 为啥值的类型从整型变成了浮点型?
### 答:因为NaN是浮点类型,所以为了兼容nan的浮点类型,因此强制的将之前的整型变成了浮点型
type(np.nan)

Out[41]:

float
In [42]:
#### nan 他等于谁?
np.nan == np.nan

Out[42]:

False
In [45]:
#### 使用fillna()方法填充nan
obj2.fillna("好")

Out[45]:

sean     12
yang     15
cloud    20
rocky     好
dtype: object
In [46]:
obj2  ### obj2在使用fillna()时相当于又重新copy了一份

Out[46]:

sean     12.0
yang     15.0
cloud    20.0
rocky     NaN
dtype: float64
In [47]:
a = obj2
a

Out[47]:

sean     12.0
yang     15.0
cloud    20.0
rocky     NaN
dtype: float64
In [48]:
#### 删除nan所在的行
obj2.dropna(inplace=True)  ### inplace = True:代表对象本身的基础上删掉

In [49]:
obj2

Out[49]:

sean     12.0
yang     15.0
cloud    20.0
dtype: float64
In [51]:
#### isnull 判断是否为空
obj2.isnull()

Out[51]:

sean     False
yang     False
cloud    False
dtype: bool

两个Series的运算

In [52]:
#### 向量运算

In [53]:
s4 = pd.Series({'height':170, 'age':18, 'salary':2000})
s4

Out[53]:

height     170
age         18
salary    2000
dtype: int64
In [54]:
s5 = pd.Series({'height':110, 'age':20, 'salary':2367})
s5

Out[54]:

height     110
age         20
salary    2367
dtype: int64
In [55]:
s4 +s5  #### 索引所对应的值进行加减乘除 

Out[55]:

height     280
age         38
salary    4367
dtype: int64
In [57]:
s6 = pd.Series({'name':110, 'age':20, 'salary':2367})
s6

Out[57]:

name       110
age         20
salary    2367
dtype: int64
In [58]:
s4 + s6

Out[58]:

age         38.0
height       NaN
name         NaN
salary    4367.0
dtype: float64
In [59]:
s1

Out[59]:

0    2
1    3
2    4
3    5
4    6
dtype: int64

Series索引

In [62]:
#### 获取 2, 4, 6三个值
#### 花式索引  中括号中套中括号  ,内层中括号写索引下标

s1[[0,2,4]]

Out[62]:

0    2
2    4
4    6
dtype: int64
In [63]:
arr = np.array([1,2,3,4,5])

In [64]:
arr

Out[64]:

array([1, 2, 3, 4, 5])
In [65]:
arr[[0,2,4]]

Out[65]:

array([1, 3, 5])

整数索引

In [68]:
sr = pd.Series(np.arange(10))
sr

Out[68]:

0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int32
In [71]:
sr1 = sr[3:]
sr1

Out[71]:

3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int32
In [73]:
sr1.iloc[0]   ####  iloc == index + location

Out[73]:

3
In [75]:
sr1.loc[3]   #### 下标 

Out[75]:

3

DataFrame

In [76]:
df = pd.DataFrame({'one':[1,2,3,4],'two':[5,6,7,8]})
df

Out[76]:

one two
0 1 5
1 2 6
2 3 7
3 4 8
In [77]:
df['one'].iloc[0]  #### 先是获取列 再然后是行

Out[77]:

1

常见的属性

In [78]:
df.index  #### 获取行索引

Out[78]:

RangeIndex(start=0, stop=4, step=1)
In [79]:
df.columns  #### 获取列索引

Out[79]:

Index(['one', 'two'], dtype='object')
In [80]:
df.T  #### 行列转置

Out[80]:

0 1 2 3
one 1 2 3 4
two 5 6 7 8
In [81]:
df.values

Out[81]:

array([[1, 5],
       [2, 6],
       [3, 7],
       [4, 8]], dtype=int64)
In [83]:
df['one'].values[0]

Out[83]:

1
In [85]:
df.describe()

Out[85]:

one two
count 4.000000 4.000000
mean 2.500000 6.500000
std 1.290994 1.290994
min 1.000000 5.000000
25% 1.750000 5.750000
50% 2.500000 6.500000
75% 3.250000 7.250000
max 4.000000 8.000000

企业中处理数据的方式

In [86]:
#### 1. 别的同事会给你一个excel文件或者csv文件
#### 2. 使用pandas读取csv文件

In [87]:
movies = pd.read_csv('./douban_movie.csv')  ### 只需要read_csv函数, 将csv中的所有数据读出
movies

Out[87]:

名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
0 肖申克的救赎 692795.0 剧情/犯罪 美国 1994-09-10 00:00:00 142.0 1994 9.6 多伦多电影节
1 控方证人 42995.0 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116.0 1957 9.5 美国
2 美丽人生 327855.0 剧情/喜剧/爱情 意大利 1997-12-20 00:00:00 116.0 1997 9.5 意大利
3 阿甘正传 580897.0 剧情/爱情 美国 1994-06-23 00:00:00 142.0 1994 9.4 洛杉矶首映
4 霸王别姬 478523.0 剧情/爱情/同性 中国大陆 1993-01-01 00:00:00 171.0 1993 9.4 香港
... ... ... ... ... ... ... ... ... ...
38730 神学院 S 46.0 Adult 法国 1905-06-05 00:00:00 58.0 1983 8.6 美国
38731 1935年 57.0 喜剧/歌舞 美国 1935-03-15 00:00:00 98.0 1935 7.6 美国
38732 血溅画屏 95.0 剧情/悬疑/犯罪/武侠/古装 中国大陆 1905-06-08 00:00:00 91.0 1986 7.1 美国
38733 魔窟中的幻想 51.0 惊悚/恐怖/儿童 中国大陆 1905-06-08 00:00:00 78.0 1986 8.0 美国
38734 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32.0 剧情/战争 苏联 1905-05-30 00:00:00 97.0 1977 6.6 美国

38735 rows × 9 columns

In [89]:
movies.describe()

Out[89]:

投票人数 时长 年代 评分
count 38735.000000 38735.000000 38735.000000 38735.000000
mean 6184.502438 89.050975 1998.788176 6.935678
std 26142.480865 83.335085 253.201997 1.270113
min -118.000000 1.000000 1888.000000 2.000000
25% 98.000000 60.000000 1990.000000 6.300000
50% 341.000000 92.000000 2005.000000 7.100000
75% 1739.500000 106.000000 2010.000000 7.800000
max 692795.000000 11500.000000 39180.000000 9.900000
In [98]:
movies.to_csv('./modify_movies.csv',index=False)   #### 保存数据到一个文件中  index=False表示不要在列名称前加索引。

In [99]:
pd.read_csv('./modify_movies.csv')

Out[99]:

名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
0 肖申克的救赎 692795.0 剧情/犯罪 美国 1994-09-10 00:00:00 142.0 1994 9.6 多伦多电影节
1 控方证人 42995.0 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116.0 1957 9.5 美国
2 美丽人生 327855.0 剧情/喜剧/爱情 意大利 1997-12-20 00:00:00 116.0 1997 9.5 意大利
3 阿甘正传 580897.0 剧情/爱情 美国 1994-06-23 00:00:00 142.0 1994 9.4 洛杉矶首映
4 霸王别姬 478523.0 剧情/爱情/同性 中国大陆 1993-01-01 00:00:00 171.0 1993 9.4 香港
... ... ... ... ... ... ... ... ... ...
38730 神学院 S 46.0 Adult 法国 1905-06-05 00:00:00 58.0 1983 8.6 美国
38731 1935年 57.0 喜剧/歌舞 美国 1935-03-15 00:00:00 98.0 1935 7.6 美国
38732 血溅画屏 95.0 剧情/悬疑/犯罪/武侠/古装 中国大陆 1905-06-08 00:00:00 91.0 1986 7.1 美国
38733 魔窟中的幻想 51.0 惊悚/恐怖/儿童 中国大陆 1905-06-08 00:00:00 78.0 1986 8.0 美国
38734 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32.0 剧情/战争 苏联 1905-05-30 00:00:00 97.0 1977 6.6 美国

38735 rows × 9 columns

In [100]:
movies.head()  #### 默认显示前5行, head中可以传入行数,查看

Out[100]:

名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
0 肖申克的救赎 692795.0 剧情/犯罪 美国 1994-09-10 00:00:00 142.0 1994 9.6 多伦多电影节
1 控方证人 42995.0 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116.0 1957 9.5 美国
2 美丽人生 327855.0 剧情/喜剧/爱情 意大利 1997-12-20 00:00:00 116.0 1997 9.5 意大利
3 阿甘正传 580897.0 剧情/爱情 美国 1994-06-23 00:00:00 142.0 1994 9.4 洛杉矶首映
4 霸王别姬 478523.0 剧情/爱情/同性 中国大陆 1993-01-01 00:00:00 171.0 1993 9.4 香港
In [102]:
movies.head(2)  #### 指定数字2,表示显示两行 

Out[102]:

名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
0 肖申克的救赎 692795.0 剧情/犯罪 美国 1994-09-10 00:00:00 142.0 1994 9.6 多伦多电影节
1 控方证人 42995.0 剧情/悬疑/犯罪 美国 1957-12-17 00:00:00 116.0 1957 9.5 美国
In [103]:
movies.tail()  #### 默认显示后5行, tail中也可以传入行数查看

Out[103]:

名字 投票人数 类型 产地 上映时间 时长 年代 评分 首映地点
38730 神学院 S 46.0 Adult 法国 1905-06-05 00:00:00 58.0 1983 8.6 美国
38731 1935年 57.0 喜剧/歌舞 美国 1935-03-15 00:00:00 98.0 1935 7.6 美国
38732 血溅画屏 95.0 剧情/悬疑/犯罪/武侠/古装 中国大陆 1905-06-08 00:00:00 91.0 1986 7.1 美国
38733 魔窟中的幻想 51.0 惊悚/恐怖/儿童 中国大陆 1905-06-08 00:00:00 78.0 1986 8.0 美国
38734 列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме... 32.0 剧情/战争 苏联 1905-05-30 00:00:00 97.0 1977 6.6 美国

DataFrame的分组

In [104]:
#### 读取某一个url网页下面的所有的表格数据
res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')

In [107]:
champion_res = res[0]

In [108]:
champion_res

Out[108]:

0 1 2 3 4 5
0 年份 比赛日期 冠军 总比分 亚军 FMVP
1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
... ... ... ... ... ... ...
69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

74 rows × 6 columns

In [109]:
##### 1.将第一行数据变成列名
champion_res.iloc[0]

Out[109]:

0      年份
1    比赛日期
2      冠军
3     总比分
4      亚军
5    FMVP
Name: 0, dtype: object
In [110]:
champion_res.columns = champion_res.iloc[0]  ### 将第一行的数据赋值给列名

In [112]:
champion_res.head()

Out[112]:

年份 比赛日期 冠军 总比分 亚军 FMVP
0 年份 比赛日期 冠军 总比分 亚军 FMVP
1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
In [113]:
champion_res.drop([0],inplace=True)

In [114]:
champion_res

Out[114]:

年份 比赛日期 冠军 总比分 亚军 FMVP
1 1947 4.16-4.22 费城勇士队 4-1 芝加哥牡鹿队
2 1948 4.10-4.21 巴尔的摩子弹队 4-2 费城勇士队
3 1949 4.4-4.13 明尼阿波利斯湖人队 4-2 华盛顿国会队
4 1950 4.8-4.23 明尼阿波利斯湖人队 4-2 塞拉库斯民族队
5 1951 4.7-4.21 罗切斯特皇家队 4-3 纽约尼克斯队
... ... ... ... ... ... ...
69 2015 6.5-6.17 金州勇士队 4-2 克里夫兰骑士队 安德烈·伊戈达拉
70 2016 6.3-6.20 克里夫兰骑士队 4-3 金州勇士队 勒布朗·詹姆斯
71 2017 6.2-6.13 金州勇士队 4-1 克利夫兰骑士队 凯文·杜兰特
72 2018 6.1-6.9 金州勇士队 4-0 克利夫兰骑士队 凯文·杜兰特
73 2019 5.31-6.14 多伦多猛龙队 4-2 金州勇士队 科怀·伦纳德

73 rows × 6 columns

In [116]:
#### 1.求每个队获取冠军的次数
#####思路:对冠军球队进行分组  mysql: group by 分组对象
champion_res.groupby('冠军')   #### 获取的是一个分组对象

Out[116]:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000000168FDB70>
In [117]:
champion_res.groupby('冠军').groups  #### 拿到每支队伍获取冠军的行索引

Out[117]:

{'休斯顿火箭队': Int64Index([48, 49], dtype='int64'),
 '克里夫兰骑士队': Int64Index([70], dtype='int64'),
 '华盛顿子弹队': Int64Index([32], dtype='int64'),
 '圣安东尼奥马刺队': Int64Index([53, 57, 59, 61, 68], dtype='int64'),
 '圣路易斯老鹰队': Int64Index([12], dtype='int64'),
 '塞拉库斯民族队': Int64Index([9], dtype='int64'),
 '多伦多猛龙队': Int64Index([73], dtype='int64'),
 '密尔沃基雄鹿队': Int64Index([25], dtype='int64'),
 '巴尔的摩子弹队': Int64Index([2], dtype='int64'),
 '底特律活塞队': Int64Index([43, 44, 58], dtype='int64'),
 '明尼阿波利斯湖人队': Int64Index([3, 4, 6, 7, 8], dtype='int64'),
 '波士顿凯尔特人队': Int64Index([11, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 28, 30, 35, 38, 40,
             62],
            dtype='int64'),
 '波特兰开拓者队': Int64Index([31], dtype='int64'),
 '洛杉矶湖人队': Int64Index([26, 34, 36, 39, 41, 42, 54, 55, 56, 63, 64], dtype='int64'),
 '纽约尼克斯队': Int64Index([24, 27], dtype='int64'),
 '罗切斯特皇家队': Int64Index([5], dtype='int64'),
 '芝加哥公牛队': Int64Index([45, 46, 47, 50, 51, 52], dtype='int64'),
 '西雅图超音速队': Int64Index([33], dtype='int64'),
 '费城76人队': Int64Index([21, 37], dtype='int64'),
 '费城勇士队': Int64Index([1, 10], dtype='int64'),
 '达拉斯小牛队': Int64Index([65], dtype='int64'),
 '迈阿密热火队': Int64Index([60, 66, 67], dtype='int64'),
 '金州勇士队': Int64Index([29, 69, 71, 72], dtype='int64')}
In [118]:
#### 2.对数据进行聚合  mysql: count sum 
champion_res.groupby('冠军').size()   #### 获取每支队伍获得冠军的次数

Out[118]:

冠军
休斯顿火箭队        2
克里夫兰骑士队       1
华盛顿子弹队        1
圣安东尼奥马刺队      5
圣路易斯老鹰队       1
塞拉库斯民族队       1
多伦多猛龙队        1
密尔沃基雄鹿队       1
巴尔的摩子弹队       1
底特律活塞队        3
明尼阿波利斯湖人队     5
波士顿凯尔特人队     17
波特兰开拓者队       1
洛杉矶湖人队       11
纽约尼克斯队        2
罗切斯特皇家队       1
芝加哥公牛队        6
西雅图超音速队       1
费城76人队        2
费城勇士队         2
达拉斯小牛队        1
迈阿密热火队        3
金州勇士队         4
dtype: int64
In [119]:
#### 3. 对数据进行排序   mysql: order by
champion_res.groupby('冠军').size().sort_values(ascending=False)  ### 默认是升序排序

Out[119]:

冠军
波士顿凯尔特人队     17
洛杉矶湖人队       11
芝加哥公牛队        6
圣安东尼奥马刺队      5
明尼阿波利斯湖人队     5
金州勇士队         4
迈阿密热火队        3
底特律活塞队        3
休斯顿火箭队        2
纽约尼克斯队        2
费城76人队        2
费城勇士队         2
塞拉库斯民族队       1
克里夫兰骑士队       1
华盛顿子弹队        1
达拉斯小牛队        1
圣路易斯老鹰队       1
西雅图超音速队       1
多伦多猛龙队        1
密尔沃基雄鹿队       1
罗切斯特皇家队       1
波特兰开拓者队       1
巴尔的摩子弹队       1
dtype: int64
</div> </div> </div> </body> **pandas第二部分:**[Pandas模块05](https://www.cnblogs.com/zhangchaocoming/p/11625767.html)
posted on 2020-03-03 18:39  jueyuanfengsheng  阅读(219)  评论(0)    收藏  举报