学习python,那么绕不过的一个工具就是Pandas,不管你是做数据分析还是爬虫,Pandas都是一个最基础也是最实用的工具。小编在总结各大IT社区相关的帖子和结合自己学习Pandas基本操作、相关知识的基础上,总结了一套自学教程,基本上涵盖了pandas的重点内容,第一部分主要讲Pandas相关的基础操作,快来收藏吧。
一、Pandas介绍
pandas 是基于NumPy的一种工具,是NumPy的一个开源 Python库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。Pandas 纳入了大量库和一些标准的数据模型 ,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
这里简单说一下Numpy和Pandas的区别,Numpy:是数值计算的扩展包,是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,它能高效处理N维数组、复杂函数、线性代数。Panadas:是做数据处理。是python的一个数据分析包。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
简单地说,你可以把 Pandas 看作是 Python 版的 Excel。Pandas能很好地处理来自各种不同来源的数据,比如 Excel 表格、CSV 文件、SQL 数据库,甚至还能处理存储在网页上的数据。Pandas基于Numpy,常常与Numpy、matplotlib一起使用。Pandas库的两个主要数据结构(数据类型):Series:一维,DataFrame:多维。
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
Time- Series:以时间为索引的Series。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
Panel :三维的数组,可以理解为DataFrame的容器。
Panel4D:是像Panel一样的4维数据容器。
PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。
在开始前我需要强调下,下面的步骤你要亲自跟着敲一遍并在自己的电脑上实践。虽然下面你会遇到很多命令,给了谁都记不住的。但是别怕,也别中途放弃,因为你没必要记住命令,因为当你在后面学习数据分析用的多了,自然就记住了。记不住也没关系,学会在哪查找就可以了。你只需要跟着上面步骤操作下,并理解了每一步是干什么的就可以了。后面遇到要做的事情,忘记了回头查这个手册就可以了。只要中途不放弃,自己实际操作一遍,我保证你可以熟练上手。
二、Pandas概述
因为pandas是python的第三方库所以使用前需要安装一下,直接使用pip install pandas 就会自动安装pandas以及相关组件,但是有的需要在官网pypi上下载,下载完成后将文件夹保存在对应的路径下,安装完成,打开idle就可以导入库。有问题可以上网搜一下解决办法,这里不再赘述。
pandas:https://pypi.org/project/pandas/#files
2.1 导入Pandas
import pandas as pd
2.2读取csv文件,并显示
import pandas as pd #导入pands。
df = pd.read_csv('F:/data/train.csv') #一会再讲dataFrame是什么东西。把
print(df) 数据从csv当中读进来。
运行结果:
从结果可以看到,把所有内容都显示出来了。
2.3 只显示前面几行
前面的例子可以看到,显示的数据太多了。我们其实就想看看数据长什么样,不需要都列出来。可以使用.head()来显示前几条。
df.head(10) #指定显示前10条数据。如果不写默认显示5条。【例1】
df[:4] #指定显示前4行数据。【例2】
df[2:5] #显示2,3,4三行数据。【例3】
例1:
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.head())
运行结果:
例2:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[:5]
print(a)
运行结果:
例3:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[2:5]
print(a)
运行结果:
2.4 看一下df的信息
http://df.info() //返回当前的信息。
【代码】
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.info())
运行结果:
<class 'pandas.core.frame.DataFrame'> #df是DataFrame结构。这是pandas最核心的结构。
RangeIndex: 891 entries, 0 to 890 #当前索引一共891个。从0到890。
Data columns (total 12 columns): #当前数据一共12列。下面分别打出每一列的信息。
PassengerId 891 non-null int64 #第一列叫PassengerId。有891个值。
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object #object类型就是String类型的串。串在pandas中是
object类型。
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB #当前占多少内存。
None
2.5 看一下df的索引
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.index)
运行结果:
RangeIndex(start=0, stop=891, step=1)
2.6 看一下df的列名(列名就是数据表中的第一行)
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.columns)
运行结果:
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
2.7:看一下每一列的类型
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.dtypes)
运行结果:
PassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
2.8 看一下df的数值
import pandas as pd
df=pd.read_csv('F:/data/train.csv')
print(df.values)
运行结果:
[[1 0 3 ... 7.25 nan 'S']
[2 1 1 ... 71.2833 'C85' 'C']
[3 1 3 ... 7.925 nan 'S']
...
[889 0 3 ... 23.45 nan 'S']
[890 1 1 ... 30.0 'C148' 'C']
[891 0 3 ... 7.75 nan 'Q']]
2.9 自己创建一个DataFarme结构
刚才讲了,怎么读取文件,然后看一下文件的信息。那能不能自己创建一个DataFrame结构呢?可以。
数据要有列名,还有有值。可以通过字典来创建。字典的key代表列名,value代表值。
代码:
import pandas as pd
data = {'country':['aaa','bbb','ccc'],
'population':[10,12,14]
}
df_data = pd.DataFrame(data)
print(df_data)
print()
print(df_data.info())
运行结果:
country population
0 aaa 10
1 bbb 12
2 ccc 14
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
country 3 non-null object
population 3 non-null int64
dtypes: int64(1), object(1)
memory usage: 128.0+ bytes
None
通过上面的例子,我们可以自己读,也可以创建DataFrame。但一般情况下都是从文件里面读文件。具体怎么得到,看自己的需求。
三、Pandas基本操作
3.1 看DataFrame中某一列的数据
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df)
print(df['Age']) #注意要加单引号。
运行结果:
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
5 NaN
6 54.0
7 2.0
8 27.0
9 14.0
10 4.0
11 58.0
.....
888 NaN
889 26.0
890 32.0
Name: Age, Length: 891, dtype: float64
我们发现第5个为NaN。表示“not a number”,
3.2 单独取的这一列也太多了,只要前几列
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
data =df['Age']
print(type(data)) #是一个Series类型。
print(data[:5]) #取0到5(不含)的元素。
运行结果:
<class 'pandas.core.series.Series'>
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
Name: Age, dtype: float64
DataFrame中的一行或者一列都可以叫做Series结构。
Series结构也有一些属性,跟DataFrame的差不多。
例1:看一下Series的索引
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
age =df['Age']
print(age.index)
运行结果:
RangeIndex(start=0, stop=891, step=1)
例2:看一下Series的值
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
age =df['Age']
print(age.values[:6]) #要加s.
运行结果:
[22. 38. 26. 35. 35. nan] #得到的是一个列表。
3.3 使用DataFrame的某一列作为索引
之前的索引是0,1,2,3...能不能改成Name这一列。即改变索引,用name作为索引。
代码:
import pandas as pd
df = pd.read_csv('F:/data/train.csv') #读文件
df = df.set_index('Name') #改成Name用Name做索引
print(df.head()) #查看前5行数据
print(df['Age'][:5]) #取“Age”这一列,显示前5行数据。
运行结果:
发现改变索引之后,结果清晰多了。查看Age这一列,也能知道是谁的年龄了。
3.4 Series通过索引找相应的值
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age['Allen, Mr. William Henry'])
运行结果:
35.0
3.5 Series计算
跟Numpy差不多。类似于Numpy的广播的效果,会对每一个值都加上10。
例1:年龄同时加10
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age[:5])
age = age +10
print(age[:5])
运行结果:
例2:求年龄的一些统计值。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
age = df['Age']
print(age.mean()) #求年龄的平均值。
print(age.max())
print(age.min())
print(age.sum())
运行结果:
29.69911764705882
80.0
0.42
21205.17
3.6 DataFrame的计算
df.sum() #把每一列都求和。【例1】
df.sum()['Age'] #结果等同于 df['Age'].sum()。【例2】
例1:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.sum())
运行结果:
例2:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.sum()['Age'])
运行结果:
21205.17
3.7 df.describe()统计信息
挨个列统计最大最小值等太麻烦了,可以用df.describe()命令对整个DateFrame进行统计分析。
注意:只统计有数值的这些列。姓名啊之类的列根本就没有统计。
代码:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df.describe())
运行结果:
count //当前这一列有多少个不为空的样本。
其他表示这一列的均值、标准差、最小值、最大值、分位数。
四、Pandas索引
下面来说一下,在pandas当中,怎么对数据进行索引。这个其实跟Numpy差不多。只不过它的用法更为丰富了一些。
4.1 获取多个列
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df[['Age','Fare']][:5]#注意两个中括号。要把'Age'和'Fare'作为整体传到df
print(df)
运行结果:
Age Fare
0 22.0 7.2500
1 38.0 71.2833
2 26.0 7.9250
3 35.0 53.1000
4 35.0 8.0500
4.2 DataFrame获取行数据
df['0']/df[0] //错误写法。DataFrame不能通过索引直接取得一行数据。【例1】。需要用到loc和iloc
df.iloc[0] //用位置来定位。【例2】
df.iloc[2:5] //拿到2,3,4三行数据。【例3】
df.iloc[2:5,:3] //切片。要2,3,4行,0,1,2列的数据。【例4】
df.loc['liupc'] //如果之前索引改成了"Name",则要通过loc来取一行。【例5】
df.loc['liupc','Age'] //可以定位到具体的一个值。【例6】
df.loc['liupc':'lijing',:] //从liupc这一行到lijing这一行,所有列的数据。【例7】
df.iloc[0,'Age'] //错误写法。应该是不能混用。要么里面全是数字,要么里面全是字符串
df.loc['Heikkinen, Miss. Laina',2] //错误写法。应该是不能混用。df.iloc[0]['Age'] //正确。这种写法相当于 a=df.iloc[0] b=a['Age']
df.loc['Heikkinen, Miss. Laina','Age'] = 99 //修改值。 【例8】
总结:
loc //如果用标签来做定位,用loc。
iloc //用具体的一个值(一个位置)来定位,用iloc。
ix //有的人还在用df.ix['liupc']这种写法。但是ix要被遗弃了,以后就不要用了。现在只用loc和iloc就行。
没有df['aaa','bbb']这种写法。当作取'aaa'和'bbb'这两列吧,少了中括号。当作取'aaa'行'bbb'列吧,前面没有loc。所以压根就没有这种写法。
例1:不能通过索引,直接获取DataFrame的行。
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df[0])
运行结果:
KeyError: 0
例2:拿一行数据
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[0]) #使用iloc(),通过位置来定位
运行结果:
例3:拿多行数据
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[2:5]) #拿3行数据
运行结果:
例4:不光拿行,还筛选列
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
print(df.iloc[2:5,:2])
运行结果:
例5:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name') #改变索引
print(df.loc['Allen, Mr. William Henry']) #通过loc来获取
运行结果:
例6:定位到具体的一个值
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')
print(df.loc['Allen, Mr. William Henry','Age'])
运行结果:
35.0
例7:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df =df.set_index('Name')
print(df.loc['Heikkinen, Miss. Laina':'Allen, Mr. William Henry',:])
运行结果:
例8:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df.loc['Heikkinen, Miss. Laina','Age']);
df.loc['Heikkinen, Miss. Laina','Age']=100
print(df.loc['Heikkinen, Miss. Laina','Age']);
运行结果:
26.0
100.0
4.3:bool类型的索引
df[df['Age']>40] #首先,df['Age']>40得到的是一串True或者False。这个本身就是索引【例1】
#然后,把这个索引传给df,可以筛选出Age>40的那些行【例2】
df[df['Sex']=='male'] #取出男性【例3】
df.loc[df['Sex']=='male','Age'].mean() #可以统计部分数据。男性,对Age这一列求平均值【例4】
#也可以写:df.loc[df['Sex']=='male','Age'].mean()
#不能写:df[df['Sex']=='male','Age'].mean()
(df['Age']>70).sum() #年龄大于70的有多少人【例5】
例1:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
print(df['Age']>40)
运行结果:
例2:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df[df['Age']>40]
print(type(a)) #还是一个DataFrame类型。
b=a['Age'][:10] #去Age这一列,前10行。
print(b) #相当于print(df[df['Age']>40]['Age'][:10])
运行结果:
可以看到a的年龄都大于40。
例3:取出男性
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name') #修改索引
a = df[df['Sex']=='male'][:10] #使用boolean索引取出男性,要前十行。
print(a)
运行结果:
例4:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = df.loc[df['Sex']=='male','Age'].mean()
print(a)
运行结果:
30.72664459161148
例5:
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
df = df.set_index('Name')
a = (df['Age']>70).sum() #统计年龄大于70的人数
print(a)
b=df[df['Age']>70]['Age']
print(b)
运行结果:
五、groupby 操作
pandas提供了一个灵活高效的groupby功能,它使你能一种自然地方式对数据集进行切片,切换,摘要等操作。根据一个或者多个键(可以是函数可以是数组或者DataFrame列名)拆分pandas对象。计算分组摘要统计,如计数、平均数、标准差、或者用户自定义的函数。
5.1 求A、B、C的data的平均值
5.1.1 数据准备
首先定义一个DataFrame,作为例子。
import pandas as pd
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
'data':[5,10,15,20,10,0,25,10,10]})
print(df)
运行结果:
5.1.2 如果使用程序实现
import pandas as pd
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
'data':[5,10,15,20,10,0,25,10,10]})
for data in ['A','B','C']:
print(data+" ",end="")
print(df.loc[df['Label']==data,'data'].sum())
运行结果:
A 50
B 30
C 25
但是这样比较麻烦。可以直接用groupby函数。
5.1.3 使用group函数求A、B、C的data的平均值
import pandas as pd
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
'data':[5,10,15,20,10,0,25,10,10]})
result=df.groupby('Label').sum()
print(result)
运行结果:
5.2 groupby结合numpy的函数
import numpy as np
import pandas as pd
df =pd.DataFrame({'Label':['A','B','C','A','B','C','A','B','C'],
'data':[5,10,15,20,10,0,25,10,10]})
result=df.groupby('Label').aggregate(np.sum) #调用numpy的函数。
print(result)
运行结果:
5.3 计算泰坦尼克数据集中男女的平均年龄
import numpy as np
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
result = df.groupby('Sex')['Age'].mean()
#先对性别做分组,然后取出Age列,求平均。
print(result)
运行结果:
5.4 计算泰坦尼克上男女获救的概率
import numpy as np
import pandas as pd
df = pd.read_csv('F:/data/train.csv')
result = df.groupby('Sex')['Survived'].mean()
print(result)
运行结果:
发现女的有74%的概率获救了,男的只有18.9%的人被救了。
六、pandas库的基础进阶
本章将会详细讲Series和DataFrame,这里先运行两个代码,看一下基本操作。
Series的创建(使用Python的列表创建Series):
import numpy as np
import pandas as pd
# 使用list创建
s1 = pd.Series([1,2,3,4]) # 可以发现索引index默认从0开始进行自动索引
s1
0 1
1 2
2 3
3 4
dtype: int64
# 值属性,可以方便查看Series的值
s1.values
array([1, 2, 3, 4], dtype=int64)
# 索引index属性,返回的是索引从开始到结束和间隔的值
s1.index
RangeIndex(start=0, stop=4, step=1)
# 使用numpy的数组进行创建
s2 = pd.Series(np.arange(10))
s2
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32
# 通过字典进行创建
s3 = pd.Series({'1':1, '2':2, '3':3})
s3
1 1
2 2
3 3
dtype: int64
s3.values
array([1, 2, 3], dtype=int64)
s3.index
Index(['1', '2', '3'], dtype='object')
# 手动赋值索引
s4 = pd.Series([1,2,3,4], index=['A','B','C','D'])
s4
A 1
B 2
C 3
D 4
dtype: int64
s4.values
array([1, 2, 3, 4], dtype=int64)
s4.index
Index(['A', 'B', 'C', 'D'], dtype='object')
s4['A'] # 根据索引取值
1
s4[s4>1] # 根据值得范围取值
B 2
C 3
D 4
dtype: int64
s4.to_dict()
# 把Series转换为字典输出,也就是说可以通过字典创建Series,也可以通过Series转换为字典
{'A': 1, 'B': 2, 'C': 3, 'D': 4}
s5 = pd.Series(s4.to_dict()) # 来回转
s5
A 1
B 2
C 3
D 4
dtype: int64
index_1 = ['A','B','C','D','E']
# 可单独把索引写出,再赋值给Series,同时多增加一个索引
s6 = pd.Series(s5, index=index_1)
s6 # 多增加的索引的值为NAN
A 1.0
B 2.0
C 3.0
D 4.0
E NaN
dtype: float64
pd.isnull(s6)
# 根据pd.isnall()判断Series的元素是否有空值,如果有返回Ture,反之False
A False
B False
C False
D False
E True
dtype: bool
pd.notnull(s6) # 类似的操作
A True
B True
C True
D True
E False
dtype: bool
s6.name = 'demo' # 给Series赋予名字
s6
A 1.0
B 2.0
C 3.0
D 4.0
E NaN
Name: demo, dtype: float64
s6.index.name = 'demo_index' # 给索引起个名字
s6
demo_index
A 1.0
B 2.0
C 3.0
D 4.0
E NaN
Name: demo, dtype: float64
s6.index
Index(['A', 'B', 'C', 'D', 'E'], dtype='object', name='demo_index')
Dataframe的创建(使用Python的列表创建Dataframe)
pandas的Dataframe学习
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import webbrowser
link = 'https://www.tiobe.com//tiobe-index/'
webbrowser.open(link)
True
df = pd.read_clipboard() # 读取粘贴板的内容
df
Sep 2018 Sep.1 2017 Change Programming Language Ratings Change.1
0 0 1 1 NaN Java 17.436% +4.75% NaN NaN
1 1 2 2 NaN C 15.447% +8.06% NaN NaN
2 2 3 5 change Python 7.653% +4.67% NaN NaN
3 3 4 3 change C++ 7.394% +1.83% NaN NaN
4 4 5 8 change Visual Basic .NET 5.308% +3.33%
5 5 6 4 change C# 3.295% -1.48% NaN NaN
6 6 7 6 change PHP 2.775% +0.57% NaN NaN
7 7 8 7 change JavaScript 2.131% +0.11% NaN NaN
8 8 9 - change SQL 2.062% +2.06% NaN NaN
9 9 10 18 change Objective-C 1.509% +0.00% NaN NaN
type(df)
pandas.core.frame.DataFrame
df.columns # 读取索引,该操作作用很大,可以读取行的索引,以此可以通过该索引进行访问
Index(['Sep', '2018', 'Sep.1', '2017', 'Change', 'Programming', 'Language',
'Ratings', 'Change.1'],
dtype='object')
df.Ratings # 通过标签读取该列内容
0 17.436%
1 15.447%
2 7.653%
3 7.394%
4 5.308%
5 3.295%
6 2.775%
7 2.131%
8 2.062%
9 1.509%
Name: Ratings, dtype: object
# 从原先的dataframe中提取想要的数据,并赋给新的dataframe,该操作很有用
df_new = DataFrame(df, columns=['Sep 2019','Sep 2018', 'Change', 'Programming Language'])
# 同时增加新的标签,并自动赋值nan
df_new
Sep 2019 Sep 2018 Change Programming Language
0 NaN 1 NaN Java
1 NaN 2 NaN C
2 NaN 3 change Python
3 NaN 4 change C++
4 NaN 5 change Visual Basic .NET
5 NaN 6 change C#
6 NaN 7 change PHP
7 NaN 8 change JavaScript
8 NaN 9 change SQL
9 NaN 10 change Objective-C
df_new['Sep 2019'] = range(10) # 给新的列标签赋值
type(df['Sep 2018'])
pandas.core.series.Series
df_new
Sep 2019 Sep 2018 Change Programming Language
0 0 1 NaN Java
1 1 2 NaN C
2 2 3 change Python
3 3 4 change C++
4 4 5 change Visual Basic .NET
5 5 6 change C#
6 6 7 change PHP
7 7 8 change JavaScript
8 8 9 change SQL
9 9 10 change Objective-C
6.1 创建一个Series
6.1.1 pd.Series(data,index)
// data参数可以是任意数据对象,比如字典、列表甚至是 NumPy 数组。【例1、3、4、5】
// index参数则是对 data 的索引值,类似字典的 key。若index省略,则为0,1,2,...。【例2】
//能存放各种不同类型的对象。【例6】
1. pd.Series([4,5,6,7],['aaa','bbb','ccc','ddd']) //通过列表创建。【例1】
2. pd.Series([4,5,6,7]) //index省略,则为0,1,2,...。【例2】
3. pd.Series(range(2,6,2)) //通过range函数创建。range()返回的是一系列数。【例3】
4. pd.Series(np.array([5,6,7,8])) //从numpy数组创建。【例4】
5. pd.Series({'a':30,'b':40,'c':50,'d':60}) //通过字典创建。键当做index,值当做data【例5】
6. pd.Series(25,['zhang','liu','li']) //从标量值创建。【例6】
7. pd.Series({4,5,True,'aaa'}) //可以存放不同类型的对象。【例7】
例1:通过列表创建Series
import numpy as np
import pandas as pd
data=[4,5,6,7]
index =['aaa','bbb','ddc','ddd']
a=pd.Series(data,index)
print(a)
运行结果:
aaa 4
bbb 5
ccc 6
ddd 7
dtype: int64
例2:省略index
import numpy as np
import pandas as pd
data=[4,5,6,7]
a=pd.Series(data)
print(a)
运行结果:
0 4
1 5
2 6
3 7
dtype: int64
例3:通过range()函数创建
import numpy as np
import pandas as pd
my_range=range(2,6,2) #从2到6,不含6,步长为2。
a=pd.Series(my_range)
print(a)
运行结果:
0 2
1 4
dtype: int64
例4:通过numpy数组创建
import numpy as np
import pandas as pd
data =np.array([5,6,7,8])
a=pd.Series(data)
print(a)
运行结果:
0 5
1 6
2 7
3 8
dtype: int32
例5:通过字典创建
import numpy as np
import pandas as pd
my_dict = {'a':30,'b':40,'c':50,'d':80}
a=pd.Series(my_dict)
print(a)
运行结果:
a 30
b 40
c 50
d 80
dtype: int64
例6:从标量值创建
import numpy as np
import pandas as pd
a=pd.Series(25,['zhang','liu','wei','wang'])
print(a)
运行结果:
zhang 25
liu 25
wei 25
wang 25
例7:可以存放不同类型的对象
import numpy as np
import pandas as pd
list =[1,3,'aaa',True]
a=pd.Series(list)
print(a)
运行结果:
0 1
1 3
2 aaa
3 True
dtype: object
6.1.2 从Series对象中获取数据
my_series['liu'] //和python字典基本一样。
例:
import numpy as np
import pandas as pd
list =[1,3,'aaa',True]
a=pd.Series(list)
print(a[2]) #aaa
b=pd.Series([2,3,4,5],['liu','li','guo','wang'])
print(b['li']) #3
6.1.3 算术运算
对 Series 的算术运算都是基于 index 进行的。我们可以用加减乘除(+ - * /)这样的运算符对两个 Series 进行运算,Pandas 将会根据索引 index,对响应的数据进行计算,结果将会以浮点数的形式存储,以避免丢失精度。如果 Pandas 在两个 Series 里找不到相同的 index,对应的位置就返回一个空值 NaN。
例:
import numpy as np
import pandas as pd
a=pd.Series([1,4,2,5],['zhang','liu','wei','wang'])
b=pd.Series([2,3,4,5],['liu','li','guo','wang'])
print(a+b)
print()
print(a-b)
print()
print(a*b)
print()
print(a/b)
运行结果:
guo NaN
li NaN
liu 6.0
wang 10.0
wei NaN
zhang NaN
dtype: float64
guo NaN
li NaN
liu 2.0
wang 0.0
wei NaN
zhang NaN
dtype: float64
guo NaN
li NaN
liu 8.0
wang 25.0
wei NaN
zhang NaN
dtype: float64
guo NaN
li NaN
liu 2.0
wang 1.0
wei NaN
zhang NaN
dtype: float64
6.2、DataFrame
6.2.1 创建DataFrame
data={'name':['li','liu','wang','zhang'],
'age':[22,23,24,25],
'class':[1,2,3,4]
}
frame=pd.DataFrame(data,index=['a','b','c','d'])
//通过字典创建。若index省略,则为0,1,2,...【例1】
例1:
import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
'age':[22,23,24,25],
'class':[1,2,3,4]
}
frame=pd.DataFrame(data)
print(frame)
运行结果:
name age class
0 li 22 1
1 liu 23 2
2 wang 24 3
3 zhang 25 4
6.2.2 获取元素
my_df['name'] //获取一列。返回的就是一个 Series。【例1】
my_df[['name','class']] //获取多列。返回的是一个DataFrame。注意两个中括号。【例2】
例1:
import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
'age':[22,23,24,25],
'class':[1,2,3,4]
}
my_df=pd.DataFrame(data)
print(my_df)
print()
a=my_df['name'] #获取一列
print(a)
print(type(my_df['name'])) #返回的就是一个 Series。
运行结果:
name age class
0 li 22 1
1 liu 23 2
2 wang 24 3
3 zhang 25 4
0 li
1 liu
2 wang
3 zhang
Name: name, dtype: object
<class 'pandas.core.series.Series'>
例2:
import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
'age':[22,23,24,25],
'class':[1,2,3,4]
}
my_df=pd.DataFrame(data)
print(my_df)
print()
a=my_df[['name','class']] #取两列
print(a)
print(type(my_df[['name','class']])) #返回的是一个DataFrame
运行结果:
name age class
0 li 22 1
1 liu 23 2
2 wang 24 3
3 zhang 25 4
name class
0 li 1
1 liu 2
2 wang 3
3 zhang 4
<class 'pandas.core.frame.DataFrame'>
6.2.3 添加新列
1. my_df['sex']=pd.Seriex(['W','M','W','M'])
#从头开始定义一个 pd.Series,再把它放到表中。【例1】
2. #利用现有的列来产生需要的新列。【例2】
例1:定义sex这一列放到DataFrame中
import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
'age':[22,23,24,25],
'class':[1,2,3,4]
}
my_df=pd.DataFrame(data)
print(my_df)
print()
my_df['sex']=pd.Series(['W','M','W','M'])
print(my_df)
运行结果:
name age class
0 li 22 1
1 liu 23 2
2 wang 24 3
3 zhang 25 4
name age class sex
0 li 22 1 W
1 liu 23 2 M
2 wang 24 3 W
3 zhang 25 4 M
例2:利用现有的列来产生需要的新列
import numpy as np
import pandas as pd
data={'name':['li','liu','wang','zhang'],
'age':['22','23','24','25'], #注意改成了字符串。否则下面的语句报错。
'class':[1,2,3,4]
}
my_df=pd.DataFrame(data)
print(my_df)
print()
my_df['id']= my_df['name'] + my_df['age']
#注意name与age列的属性应该相同,都是字符串。
print(my_df)
运行结果:
name age class
0 li 22 1
1 liu 23 2
2 wang 24 3
3 zhang 25 4
name age class id
0 li 22 1 li22
1 liu 23 2 liu23
2 wang 24 3 wang24
3 zhang 25 4 zhang25
QQ群:101 750 3955,免费领取相关的资料,包括电子版书籍、Python基础教程、Python全栈和数据分析相关的视频资料。在群里一起交流互助,还会定期分享数据竞赛、python公开技术讲座,精彩多多,福利多多。