一、Pandas概述
注释:
段落注释
"""
"""
单行注释:#
快捷键注释:选中要注释的行 ctrl+/ (取消注释同理)
Pandas(Python Data Analysis Library)是基于NumPy的数据分析模块,它提供了大量标准数据模型和高效操作大型数据集所需的工具,可以说Pandas是使得Python能够成为高效且强大的数据分析环境的重要因素之一。
安装pandas的第三方包
如果安装pandas失败,可以先装下pip,如下图
导入方式:import pandas as pd
Pandas有三种数据结构:Series、DataFrame和Panel。
Series类似于一维数组;
DataFrame是类似表格的二维数组;
Panel可以视为Excel的多表单Sheet
二、Series 是一种一维数组对象,包含了一个值序列,并且包含了数据标签,称为索引(index),可通过索引来访问数组中的数据
1、通过列表创建Series
import pandas as pd
obj = pd.Series([1,-2,3,-4])
print(obj)
输出结果
输出的第一列为index,第二列为value,如果创建Series时没有指定index,Pandas会采用从0开始的整型数据作为Series的 index
2、创建Series时指定索引
i = ['a','b','d','c']
v = [2,4,5,7]
obj = pd.Series(v,index=i,name='col')
print(obj)
3、Series位置和标签的使用
val = [2,4,5,6]
idx1 = range(10,14)
idx2 = "hello world my baby".split()
s0 = pd.Series(val)
s1 = pd.Series(val,index=idx1)
s2 = pd.Series(val,index=idx2)
print(s0.index)
print(s1.index)
print(s2.index)
print(s0)
print(s1)
print(s2)
print(s0[0])
print(s1[10])
print(s2["my"])
4、通过字典创建Series
sda = {'a':10,'b':100,'c':500,'d':800}
obj = pd.Series(sda)
print(sda)
print(sda['b'])
5、键值和指定的索引不匹配
如果字典中的键值和指定的索引不匹配,则对应的值是nan或NaN(非数字 not a number)
sda = {'a':10,'b':100,'d':800}
letter = ['a','b','c','d']
obj = pd.Series(sda,index=letter)
print(obj['c'])
print(sda)
输出结果:
6、不同索引数据的自动对齐
sda = {'a':10,'b':100,'d':800}
obj1 = pd.Series(sda)
letter = ['a','c','d']
obj2 = pd.Series(sda,index=letter)
print(obj1+obj2)
输出结果:
7、Series索引的修改
obj1 = pd.Series([4,8,5,9])
obj1.index=['lu','li','zh','w']
print(obj1)
三、DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。
DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
1、DataFrame的创建
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
print(df)
输出结果
注:创建时可以指定列名的顺序
df = pd.DataFrame(data,columns=['name','year','sex','city'])
2、DataFrame创建时的空缺值
注:如果传入的列在数据中找不到,就会产生NaN的值(例如下面的address)
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data,columns=['name','year','sex','city','address'])
print(df)
输出结果:
3、创建时指定列名和行索引
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
# 指定行索引
df = pd.DataFrame(data,columns=['name','sex','year','city'],index=['a','b','c','d'])
print(df)
输出结果:
4、DataFrame的属性
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
print(df)
print('值为:',df.values)
print('索引为:',df.index)
print('元素的个数:',df.size)
print('维度:',df.ndim)
print('形状:',df.shape)
5、使用列数据作为索引
可以通过set_index方法来实现。
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
#将city列作为索引
df2 = df.set_index('city')
print(df2)
输出结果:
6、DataFrame数据的查询
6.1 查询指定的列:可以按名称,也可以按类型
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
df2 = df.set_index('city')
df3 = df[['name','year']]
#选取int64类型的,默认前5条
print(df.select_dtypes(include='int64').head())
# 选取非object类型,前2条记录
print(df.select_dtypes(exclude='object').head(2))
#选取两列 name,year
print(df3)
6.2 查询指定的行
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
df2 = df.set_index('city')
df3 = df[['name','year']]
#print(df.select_dtypes(include='int64').head()) #print(df.select_dtypes(exclude='object').head(2))
print(df3)
#显示前两行
print('选前两行:\n',df[:2])
#第二行和第三行 索引(1,2)
print('1-3行:/n',df[1:3])
6.3 数据查询
head 和tail是从头或尾连续获取,而sample可以随机抽取数据并显示。
head() #默认获取前5行
head(n)#获取前n行
tail()#默认获取后5行
tail(n)#获取后n行
sample(n)#随机抽取n行显示
sample(frac=0.6) #随机抽取60%的行
6.4选取行和列
选取行和列
DataFrame.loc(行索引名称或条件,列索引名称)
DataFrame.iloc(行索引位置,列索引位置)
使用loc
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
print(df)
df2 = df.set_index('city')
#选择指定名称的三个列
print(df.loc[:,['name','year','sex']])
#北京和上海的显示姓名和出生年份(注意,要以city作为索引,故加上df2 = df.set_index('city'))
print(df2.loc[['北京','上海'],['name','year']])
#出生日期大于2000的name和year的值
print(df2.loc[df2['year']>2000,['name','year']])
使用iloc
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2002,2000,2002], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
#df2 = df.set_index('city')
print(df)
#索引为2的列
print(df.iloc[:,2])
#索引1-3行
print(df.iloc[[1,3]])
print(df.iloc[[1,3],[1,2]])
输出结果
行和列的选取还可以通过query方法实现
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
print(df.query('year>=2001'))
print(df.query('year>2001 & year<2004'))
7、删除数据
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
df2 = df.set_index('city')
#df2.drop('上海',axis=0,inplace=True) #删除的上海是按city建立索引的, axis=0按行删除,如果删除李四会报错
df2.drop('sex',axis=1,inplace=True) # 删除sex列,axis=1是按列删除,inplace==true是否改变原数据 print(df2)
8、数据修改
第一种:直接赋值
第二种:replace
修改数据还可以使用replace进行数据的替换,用法如下:
DataFrame.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method='pad')
其中主要参数to_replace表示被替换的值,value表示替换后的值。同时替换多个值时使用字典数据,
如DataFrame.replace({'B':'E','C':'F'})表示将表中的B替换为E,C替换为F。
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
print(df)
#把石家庄替换为广州
df.replace(to_replace='石家庄',value='广州',inplace=True)
print(df)
第三种:修改列名rename
data={ 'name':['张三','李四','王五','赵六'], 'sex':['female','mail','female','male'], 'year':[2001,2003,2000,2004], 'city': ['北京','上海','石家庄','深圳'] }
df = pd.DataFrame(data)
print(df)
df.rename(columns={'year':'years'},inplace=True)
print(df)
9、算术运算
9.1 Series数据相加
索引值匹配的相加,不匹配的NaN
obj1 = pd.Series([1,3,5,7],index=['a','c','g','f'])
print(obj1)
obj2 = pd.Series([2,4,6,8],index=['a','b','g','h'])
print(obj2)
print(obj1+obj2)
9.2 DataFrame数据相加
a = np.arange(6).reshape(2,3)
b = np.arange(4).reshape(2,2)
df1 = pd.DataFrame(a,columns=['a','b','e'],index=['A','C'])
print('df1:\n',df1)
df2 = pd.DataFrame(b,columns=['a','b'],index=['A','C'])
print('df2:\n',df2)
9.3 函数应用和映射
map函数:将函数套用到Series的每个元素中;
例如:将水果价格表中的“元”去掉。
data = {'fruit':['apple','banana','orange'],'price':['30元','40元','50元']}
df1 = pd.DataFrame(data)
print(df1)
#定义一个方法f
def f(x):
return x.split('元')[0]
df1['price'] = df1['price'].map(f)
print(df1)
10、排序
10.1 sort_index()方法:对索引进行排序,默认为升序,降序排序时加参数 ascending=False。
wy = pd.Series([1,-2,4,-4],index=['c','b','a','d'])
print(wy)
print('索引排序后:\n',wy.sort_index()) #排序后,输出的索引为a,b,c,d
10.2 sort_values()方法:对数值进行排序。by参数设置待排序的列名
wy = pd.Series([1,-2,4,-4],index=['c','b','a','d'])
print(wy)
print('值排序后:\n',wy.sort_values())
11、汇总与统计
11.1 数据汇总 sum
df2 = pd.DataFrame(np.random.randn(3,3),columns=['a','b','c'],index=['app','win','mac']) print(df2)
print("按列汇总:\n",df2.sum())
print("按行汇总:\n",df2.sum(axis=1))
输出结果:
11.2 数据描述与统计 describe:用来概括整体状况,以及事物间关联,类属关系的统计
df2 = pd.DataFrame(np.random.randn(3,3),columns=['a','b','c'],index=['app','win','mac']) print(df2)
print(df2.describe())
输出结果:
11.3 unique方法获取不重复的数组,利用value_counts方法实现频数统计
obj = pd.Series(['a','b','c','a','a','c','d'])
print(obj.unique())
print(obj.value_counts())
输出结果: