一.pandas
1.什么是pandas?
pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
2.pandas的常用数据类型
(1).Series 一维,带标签数组
(2).DataFrame 二维,Series容器
3.pandas之Series创建
(1).通过列表建立serise eg:Day_04_mydata_01
pd.Series(可迭代对象,index=())
string.ascii_uppercase[从A开始:所需要表示的字母个数] #使用这个方法可以产生字母迭代对象
import pandas as pd
import string
import numpy as np
t=pd.Series(np.arange(1,16),index=list(string.ascii_uppercase[:15])) #给对应的数组增加相对应的索引
print(t)
A 1
B 2
C 3
D 4
E 5
F 6
G 7
H 8
I 9
J 10
K 11
L 12
M 13
N 14
O 15
dtype: int32
(2).通过字典建立series eg:Day_04_mydata_02
pd.Series(a) #直接将字典放入即可,如果索引和内容对不上则显示nan
import pandas as pd
import numpy as np
import string
a={string.ascii_uppercase[i]:i for i in range(0,10)}
print("字典a:",a)
t1=pd.Series(a) #通过字典来创建一个series,其中索引就是字典的键
print(t1)
t2=pd.Series(a,index=list(string.ascii_uppercase[5:15]))
print(t2)
字典a: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9}
A 0
B 1
C 2
D 3
E 4
F 5
G 6
H 7
I 8
J 9
dtype: int64
F 5.0
G 6.0
H 7.0
I 8.0
J 9.0
K NaN
L NaN
M NaN
N NaN
O NaN
dtype: float64
4.pandas之Series切片和索引 eg:Day_04_mydata_03
切片:直接设置start、end、step即可
索引:一个的时候直接设置序号或索引,多个可以采用列表进行设置
import pandas as pd
import numpy as np
import string
a={string.ascii_uppercase[i]:i for i in range(0,10)}
print("字典a:",a)
t1=pd.Series(a) #通过字典来创建一个series,其中索引就是字典的键
print("切片:",t1[2:10:2])
print(t1[1])
print("通过序号索引:",t1[[2,3,6]])
print("布尔索引:",t1[t1>5])
print("通过索引进行索引:",t1["A"])
print("多个索引进行索引:",t1[["A",'B','G','F']])
字典a: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9}
切片: C 2
E 4
G 6
I 8
dtype: int64
1
通过序号索引: C 2
D 3
G 6
dtype: int64
布尔索引: G 6
H 7
I 8
J 9
dtype: int64
通过索引进行索引: 0
多个索引进行索引: A 0
B 1
G 6
F 5
dtype: int64
5.series 本质上由两个数组组成 eg:Day_04_mydata_04
ndarray的很多方法可以用在series中。
import pandas as pd
import numpy as np
import string
a={string.ascii_uppercase[i]:i for i in range(0,10)}
print("字典a:",a)
t1=pd.Series(a) #通过字典来创建一个series,其中索引就是字典的键
print("t1的索引:",t1.index)
print("t1的值:",t1.values)
print(type(t1.index))
print(type(t1.values))
字典a: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9}
t1的索引: Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')
t1的值: [0 1 2 3 4 5 6 7 8 9]
<class 'pandas.core.indexes.base.Index'>
<class 'numpy.ndarray'>
6.pandas之DataFrame
pandas之读取外部数据:pd. read_csv
(1)DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
(2)DataFrame的相关属性
-
设置行和列的索引 eg:Day_04_mydata_05
index=。。。;colums=。。。
import pandas as pd
import numpy as np
import string
t1=pd.DataFrame(np.arange(24).reshape(4,6))
print(t1)
t1=pd.DataFrame(np.arange(24).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
0 1 2 3 4 5
0 0 1 2 3 4 5
1 6 7 8 9 10 11
2 12 13 14 15 16 17
3 18 19 20 21 22 23
U V W X Y Z
A 0 1 2 3 4 5
B 6 7 8 9 10 11
C 12 13 14 15 16 17
D 18 19 20 21 22 23
- DataFrame的相关属性 eg:Day_04_mydata_06
import pandas as pd
import numpy as np
import string
data_list=pd.read_csv("./dogNames2.csv") #读出csv文件
print(data_list)
df=data_list.sort_values(by="Count_AnimalName",ascending=False) #ascending标识为false则为降序,此处不需要有引号
print(df.head(5)) #显示前五条数据
print(data_list.shape)
print(data_list.dtypes)
print(data_list.ndim)
print(data_list.index)
print(data_list.columns)
print(data_list.info()) #此处info()要加括号表示一个方法
print(data_list.describe())
Row_Labels Count_AnimalName
0 RENNY 1
1 DEEDEE 2
2 GLADIATOR 1
3 NESTLE 1
4 NYKE 1
... ... ...
4159 ALEXXEE 1
4160 HOLLYWOOD 1
4161 JANGO 2
4162 SUSHI MAE 1
4163 GHOST 3
[4164 rows x 2 columns]
Row_Labels Count_AnimalName
858 BELLA 112
4134 MAX 82
3273 LUCY 82
843 BUDDY 79
433 SADIE 77
(4164, 2)
Row_Labels object
Count_AnimalName int64
dtype: object
2
RangeIndex(start=0, stop=4164, step=1)
Index(['Row_Labels', 'Count_AnimalName'], dtype='object')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4164 entries, 0 to 4163
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Row_Labels 4164 non-null object
1 Count_AnimalName 4164 non-null int64
dtypes: int64(1), object(1)
memory usage: 65.2+ KB
None
Count_AnimalName
count 4164.000000
mean 2.643372
std 5.836910
min 1.000000
25% 1.000000
50% 1.000000
75% 2.000000
max 112.000000
7.pandas之取行或者列
- pandas之loc:df.loc 通过标签索引行数据 eg:Day_04_mydata_07
import pandas as pd
import numpy as np
import string
t1=pd.DataFrame(np.arange(1,25).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
print("*"*100)
print(t1.loc["A","W"] )#此处索引需要使用列表的括号进行索引
print("*"*100)
print(t1.loc["A",["U","X","Z"]])
print(type(t1.loc["A",["U","X","Z"]]))
print("*"*100)
print(t1.loc[["A","C"],["U","X",'Y']])
print("*"*100)
print(t1.loc["A":,["U","X","Z"]]) #在loc索引中,冒号是闭合的,即可以取到冒号后面的元素
U V W X Y Z
A 1 2 3 4 5 6
B 7 8 9 10 11 12
C 13 14 15 16 17 18
D 19 20 21 22 23 24
****************************************************************************************************
3
****************************************************************************************************
U 1
X 4
Z 6
Name: A, dtype: int32
<class 'pandas.core.series.Series'>
****************************************************************************************************
U X Y
A 1 4 5
C 13 16 17
****************************************************************************************************
U X Z
A 1 4 6
B 7 10 12
C 13 16 18
D 19 22 24
- pandas之iloc eg:Day_04_mydata_08
import pandas as pd
import numpy as np
import string
t1=pd.DataFrame(np.arange(1,25).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
print(t1.iloc[1,3]) #选中一个元素
print("*"*10)
print(t1.iloc[1:3,4])
print("*"*10)
print(t1.iloc[[0,3],[1,4]])
U V W X Y Z
A 1 2 3 4 5 6
B 7 8 9 10 11 12
C 13 14 15 16 17 18
D 19 20 21 22 23 24
10
**********
B 11
C 17
Name: Y, dtype: int32
**********
V Y
A 2 5
D 20 23
- pandas之布尔索引 eg:Day_04_mydata_09
假如我们想找到所有的使用次数超过50的狗的名字,应该怎么选择?通过布尔索引可以选择需要的特定元素。
import pandas as pd
import numpy as np
import string
data_list=pd.read_csv("./dogNames2.csv")
print(data_list[data_list["Count_AnimalName"]>50]) #通过data_list进行两次索引
print(data_list[data_list["Count_AnimalName"]>50]&data_list[data_list["Row_Labels"].str.len()>4])
#使用str的len方法来计算字符串长度
回到之前狗的名字的问题上,假如我们想找到所有的使用次数超过50并且名字的字符串的长度大于4的狗的名字,应该怎么选择?
import pandas as pd
import numpy as np
import string
data_list=pd.read_csv("./dogNames2.csv")
print(data_list[data_list["Count_AnimalName"]>50]) #通过data_list进行两次索引
#print(data_list[(data_list["Count_AnimalName"]>50)&(data_list["Row_Labels"].str.len()>4]))
print(data_list[(data_list["Count_AnimalName"]>50)&(data_list["Row_Labels"].str.len()>4)])
#使用str的len方法来计算字符串长度
Row_Labels Count_AnimalName
208 BAILEY 58
335 DAISY 66
433 SADIE 77
843 BUDDY 79
858 BELLA 112
1451 GINGER 60
1551 MOLLY 60
3173 CHARLIE 64
3273 LUCY 82
3281 LILY 55
4047 JACK 57
4134 MAX 82
Row_Labels Count_AnimalName
208 BAILEY 58
335 DAISY 66
433 SADIE 77
843 BUDDY 79
858 BELLA 112
1451 GINGER 60
1551 MOLLY 60
3173 CHARLIE 64
8.pandas之字符串方法
9.缺失数据的处理 eg:Day_04_mydata_10
判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
处理方式1:删除NaN所在的行列dropna (axis=0, how='any', inplace=False)
处理方式2:填充数据,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
处理为0的数据:t[t==0]=np.nan
当然并不是每次为0的数据都需要处理
计算平均值等情况,nan是不参与计算的,但是0会
import pandas as pd
import numpy as np
import string
t1=pd.DataFrame(np.arange(1,25).reshape(4,6),index=list(string.ascii_uppercase[0:4]),columns=list(string.ascii_uppercase[-6:]))
print(t1)
print("*"*100)
t1.loc[["C","D"],["U","V"]]=np.nan
print(t1)
print("*"*100)
print(t1[pd.isnull(t1["V"])])
print(t1[pd.notnull(t1["V"])])
print(pd.isnull(t1))
print(pd.notnull(t1))
print("*"*100)
t1.dropna (axis=0, how='any', inplace=False) #参数为any,则删除带有nan的每一行,参数为all,则山粗和全部时nan的行
t1=t1.fillna(t1.mean()) #将平均值填入到nan处
print(t1)
U V W X Y Z
A 1 2 3 4 5 6
B 7 8 9 10 11 12
C 13 14 15 16 17 18
D 19 20 21 22 23 24
****************************************************************************************************
U V W X Y Z
A 1.0 2.0 3 4 5 6
B 7.0 8.0 9 10 11 12
C NaN NaN 15 16 17 18
D NaN NaN 21 22 23 24
****************************************************************************************************
U V W X Y Z
C NaN NaN 15 16 17 18
D NaN NaN 21 22 23 24
U V W X Y Z
A 1.0 2.0 3 4 5 6
B 7.0 8.0 9 10 11 12
U V W X Y Z
A False False False False False False
B False False False False False False
C True True False False False False
D True True False False False False
U V W X Y Z
A True True True True True True
B True True True True True True
C False False True True True True
D False False True True True True
****************************************************************************************************
U V W X Y Z
A 1.0 2.0 3 4 5 6
B 7.0 8.0 9 10 11 12
C 4.0 5.0 15 16 17 18
D 4.0 5.0 21 22 23 24
10.pandas常用统计方法 eg:Day_04_mydata_11
import pandas as pd
import numpy as np
import string
data_list=pd.read_csv("./datasets_IMDB-Movie-Data.csv")
#print(data_list)
print(data_list.info())
print(data_list["Rating"].mean())
print(len(set(data_list["Director"].tolist()))) #此处列表也可以进行元素个数统计,但是要计算不重复的元素个数,必须使用元组
print(len(data_list["Director"].unique())) #使用unique也可以进行不相同数据的统计
#print(len(set(data_list["Actors"].tolist()))) #此处不能直接使用元组转换,需要用spit进行分割,因为一部电影可以有多个演员,但是只有一个导演
actor_list=data_list["Actors"].str.split(",").tolist()
actor_list1=[i for j in actor_list for i in j ] #进行两次遍历可以将多维列表进行转换成单独列表
actor_num=len(set(actor_list1)) #此处不需要在转换成列表,因为它本身就是列表
print(actor_num)
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Rank 1000 non-null int64
1 Title 1000 non-null object
2 Genre 1000 non-null object
3 Description 1000 non-null object
4 Director 1000 non-null object
5 Actors 1000 non-null object
6 Year 1000 non-null int64
7 Runtime (Minutes) 1000 non-null int64
8 Rating 1000 non-null float64
9 Votes 1000 non-null int64
10 Revenue (Millions) 872 non-null float64
11 Metascore 936 non-null float64
dtypes: float64(3), int64(4), object(5)
memory usage: 93.9+ KB
None
6.723200000000003
644
644
2394