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
修改:问题同上,括号少加