2021-03-02 学习pandas

pandas

numpy能够处理数值,pandas除了处理数值之外(基于numpy),还能够处理其他类型的数据,例如字符串、时间序列等,以及存储在Excel、数据库中的数据

数据类型

  • 一维 Series

    • 带标签(index索引)数组,可以指定索引值,但要有len(values)一致,否则报错
    • 本质上由两个数组构成,1个数组构成对象的键(index 索引),1个数组构成对象的值(values)
  • 二维 DataFrame

    • Series容器
    • 从DataFrame中单独取行取列,出来的数值是Series类型,可理解为它是Series容器

在这里插入图片描述

Series操作方法

创建

  • 直接创建
In [1]: import pandas as pd                                                     

In [2]: t1= pd.Series([1,2,3,4,5,6,7])                                          

In [3]: t1                                                                      
Out[3]: 
0    1
1    2
2    3
3    4
4    5
5    6
6    7
dtype: int64

 	指定index值
In [6]: t2 = pd.Series([1,2,3,4,5],index=list('abcde'))                         

In [7]: t2                                                                      
Out[7]: 
a    1
b    2
c    3
d    4
e    5
dtype: int64

  • 字典推导式创建

    • Dtype(‘O’)/ object 说明该Series里有字符串
In [8]: temp_dict={'name':'amber','age':22,'tel':10001}                         

In [9]: t3 = pd.Series((temp_dict))                                             

In [10]: t3                                                                     
Out[10]: 
name    amber
age        22
tel     10001
dtype: object

In [11]: import string                                                          

In [12]: a = {string.ascii_uppercase[i]:i for i in range(10)}                   

In [13]: a                                                                      
Out[13]: 
{'A': 0,
 'B': 1,
 'C': 2,
 'D': 3,
 'E': 4,
 'F': 5,
 'G': 6,
 'H': 7,
 'I': 8,
 'J': 9}

索引切片

tips:Pandas Series里的where, a.where(a>2,10)实际是小于2的值替换为10,与numpy作用不一样,需注意

  • 切片

    • 直接传入start end (step)即可
    • 在切片时取Series里没有的index时,会产生一个对应的index,值为NaN
      • (numpy中NaN为float类型,pandas会自动根据数据类型更改Series的dtype类型)
  • 索引

    • 一个的时候直接传入序号或index,多个的时候传入序号或index的列表
    • 通过对象.index获取Series的索引(pandas类型)
    • 通过对象.valus获取Series的值(ndarray类型)
In [20]: b[2:10:2]                                                              
Out[20]: 
C    2
E    4
G    6
I    8
dtype: int64

In [22]: b[[2,3,6]]                                                             
Out[22]: 
C    2
D    3
G    6
dtype: int64

In [23]: b[b>4]                                                                 
Out[23]: 
F    5
G    6
H    7
I    8
J    9
dtype: int64

In [24]: b['F']                                                                 
Out[24]: 5

In [27]: b[['A','J','Z']]                                                       
Out[27]: 
A    0.0
J    9.0
Z    NaN
dtype: float64

In [28]: b.index                                                                
Out[28]: Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')

In [29]: b.values                                                               
Out[29]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [13]: a = pd.Series(range(5))          
In [14]: a                                 
Out[14]: 
0    0
1    1
2    2
3    3
4    4
dtype: int64
In [15]: a.where(a>2,10)
Out[15]: 
0    10
1    10
2    10
3     3
4     4

DataFrame操作方法

创建

  • 直接创建
In [22]: t = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ'))                                                           

In [23]: t                                                                      
Out[23]: 
  W  X   Y   Z
a  0  1   2   3
b  4  5   6   7
c  8  9  10  11
  • 字典推导式

    • 整个字典传入键值对列表

    • 传入一个列表,里边有多个字典,其中’键’变为列索引,因为1行代表1条数据

      • DataFrame传入数据,字典保留的位置缺失位置会出现NaN
In [25]: d1 = {'name':['xiaoshou','xiaoyu'],'age':[30,32],'tel':[123,456]}      

In [26]: d1 = pd.DataFrame(d1)                                                  

In [27]: d1                                                                     
Out[27]: 
       name  age  tel
0  xiaoshou   30  123
1    xiaoyu   32  456

In [29]: d2 = [{'name':'xiaohu','age':20,'tel':101},{'name':'xiaoming','tel':202 },{'name':'xiaoyang','age':32}]                                        

In [30]: d2 = pd.DataFrame(d2)                                                  

In [31]: d2                                                                     
Out[31]: 
    age      name    tel
0  20.0    xiaohu  101.0
1   NaN  xiaoming  202.0
2  32.0  xiaoyang    NaN

部分常用方法、属性

在这里插入图片描述
在这里插入图片描述

取值赋值

  • loc 通过标签索引获取数据
In [3]: t = pd.DataFrame(np.arange(12).reshape(3,4),index=list('ABC'),columns=li
   ...: st('WXYZ'))                                                             

In [4]: t                                                                       
Out[4]: 
   W  X   Y   Z
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

In [6]: t.loc['A','W']                                                          
Out[6]: 0

In [7]: t.loc['B','Y']                                                          
Out[7]: 6

In [8]: t.loc['A',['Y','X']]                                                    
Out[8]: 
Y    2
X    1
Name: A, dtype: int64

In [9]: t.loc[['A','C'],'Y']                                                    
Out[9]: 
A     2
C    10
Name: Y, dtype: int64

In [10]: t                                                                      
Out[10]: 
   W  X   Y   Z
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

In [11]: t.loc[['A','C'],['X','Z']]                                             
Out[11]: 
   X   Z
A  1   3
C  9  11

In [12]: t.loc['A':'C','W':'Y']                                                 
Out[12]: 
   W  X   Y
A  0  1   2
B  4  5   6
C  8  9  10

  • iloc 通过位置获取数据
In [14]: t                                                                      
Out[14]: 
   W  X   Y   Z
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

In [15]: t.iloc[1]                                                              
Out[15]: 
W    4
X    5
Y    6
Z    7
Name: B, dtype: int64

In [16]: type(t.iloc[1])                                                        
Out[16]: pandas.core.series.Series
In [18]: t.iloc[0:2,:]                                                          
Out[18]: 
   W  X  Y  Z
A  0  1  2  3
B  4  5  6  7

In [19]: t.iloc[0:2,0:1]                                                        
Out[19]: 
   W
A  0
B  4

In [20]: t                                                                      
Out[20]: 
   W  X   Y   Z
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11

In [21]: t.iloc[0:2,0:1]                                                        
Out[21]: 
   W
A  0
B  4

In [22]:                                                                        

In [22]: t.iloc[0:2,0:2]                                                        
Out[22]: 
   W  X
A  0  1
B  4  5

  • 赋值更改数据
In [28]: t.loc['A','Z']=100                                                     

In [29]: t                                                                      
Out[29]: 
   W  X   Y    Z
A  0  1   2  100
B  4  5   6    7
C  8  9  10   11

In [30]: t.iloc[[0,1],[1,3]]=200                                                

In [31]: t                                                                      
Out[31]: 
   W    X   Y    Z
A  0  200   2  200
B  4  200   6  200
C  8    9  10   11

获取外部数据

可直接阅读:pd.read_csv(file_path)pd.read_excel(file_path)
读取数据库:pd.read_sql(file_path),mongodb先导入文件再传入DataFrame
排序方法:df.sort_values(by="Count_AnimalName",ascending=False)
限定条件获取:不同的条件之间需要用括号括起来,使用连接符& | print(df[(df['Row_Labels'].str.len()>4)&(df['Count_AnimalName']>40)])

import pandas as pd
df = pd.read_csv('dogNames2.csv')
#print(df.head())
#print('*'*100)
#print(df.info())

df = df.sort_values(by='Count_AnimalName', ascending=False)
#print(df_sort_values)
#head() 默认取前5行
#tail() 默认取后5行
#print(df_sort_values.head(5))

#pandas取行取列的注意点
#   - 方括号写数字,表示取行,对行进行操作
#   - 写字符串,表示取列,对列进行操作
#print(df_sort_values[:20])
#print(df_sort_values['Row_Labels'])    Series类型

print(df[df['Count_AnimalName']>80])
print('*'*100)
print(df[(df['Row_Labels'].str.len()>4)&(df['Count_AnimalName']>40)])

用于字符串的方法

在这里插入图片描述

缺失数据的处理

在这里插入图片描述
在这里插入图片描述

统计方法

在这里插入图片描述

  • 实操(出现几个知识点)

    • set()将列表转为集合,集合特点是元素不重复,集合的值必须是可哈希的,也就是说集合里面的元素必须是数字类型、元组、字符串等不可变类型
    • numpy是处理数值型数据,flatten将二维转一维
    • unique() 数据去重并返回列表
import pandas as pd
import numpy as np

file_path = 'IMDB-Movie-Data.csv'
df = pd.read_csv(file_path)
print(df.info())

#获取评分平均分
print(df['Rating'].mean())

#获取导演的人数
#set()将列表转为集合,集合特点是元素不重复
print(len(set(df['Director'].tolist())))
#unique 数据去重并返回列表
print(len(df['Director'].unique()))

#获取演员的数量
temp_actor_list = df['Actors'].str.split(', ').tolist()
#print(temp_actor_list)
# temp_actor_list的结果是大列表(actors)嵌套小列表(各电影演员表)
# 所以要获取人数需要走2套循环
actor_list = [i for j in temp_actor_list for i in j]

#集合的值必须是可哈希的,也就是说集合里面的元素必须是数字类型、元组、字符串才可以
#temp_actor_list是列表类型,可变类型
#numpy是处理数值型数据,flatten将二维转一维
#actor_list = np.array(temp_actor_list).flatten()

print(len(set(actor_list)))

错误记录

错误1:pd.DataFrame(np.arange(12).reshape(3,4),index=('abc'),columns=('wxyz'))
报错信息:TypeError: Index(...) must be called with a collection of some kind, 'abc' was passed
修改:表面看是括号少加,本质上是index对象包括index和columns,必须要是集合类型的,可以是{},[],,

错误2:b['A','J','G']
报错信息:TypeError: 'tuple' object cannot be interpreted as an integer
修改:问题同上,括号少加

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值