三句话让我彻底学蒙圈的Pandas

发布于 2021-09-14  3734 次阅读


Pandas主要用于数据分析,可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

万恶之源-Pandas的导包

import pandas as pd

Pandas 应用

他的主要结构就两个 Series(一维数据) 与 DataFrame(二维数据)。
Series 是类似与一维数组的结构,它是由一组数据,和一组相关的标签(索引)组成。
DataFrame 是一个表格型的数据结构,既有 行索引 又有 列索引 ,它可以被看成是由Series组成的巨大字典。
Series→系列
DataFrame→数据帧

Series数据结构

Series函数内容

pd.Series(data,index)

data的位置是一组数据,index指的是索引标签,如果不设置index的参数默认是从0开始。

方法一:使用numpy数组(不要忘记导入numpy包)

列表的数据也是可以的,不过用numpy会更好一些

na = np.array([1,2,3])
s = pd.Series(na)
print(s)
#创建一个有索引的系列/或者说,给它加上索引
s = pd.Series(na,index=['A','B','C'])
print(s)
运行结果

方法二:使用字典创建

#data = {‘键’:值,……}
#s = pd.Series(data)
#实例:
data = {1:'A',2:'B',3:'C'}
s = pd.Series(data)
print(s)
运行结果

我们同样可以在定义系列对象的时候添加index属性来设置相应索引,暂不做更多描述。

DataFrame数据结构

DataFrame函数内容

pd.DataFrame(data,index,columns)

data 表示的是一组数据
index 行索引值
columns 列索引值。
(两个默认索引都是从0开始)

创建DataFrame数据帧对象

方法一:使用二维列表

L=[[值,……],[ 值,……]]
df=pd.DataFrame(L,columns=[列索引标签,])

方法二:使用字典

data = {‘键’:[值,……],……}
df=pd.DataFrame(data)

方法三:使用多个系列创建数据帧

a = pd.Series([值,……],index=[‘列索引标签’,])
b = pd.Series([值,……],index=[‘列索引标签’,])
df=pd.DataFrame([a,b])

可以理解为,将两个列表缝合在一块

Columns用来表示列索引

Index用来表示行索引

添加一列:

数据帧名[“新的列名“]=[值,……]

添加一行:

对象.append(另一个序列/列表的变量名)

append添加新的一行,不对原数据进行操作不要忘记赋值。

删除某一列:

方法一:

del 数据帧名[‘列索引名’]

方法二:

#列删除
数据帧名.drop(labels=[标签名],axis=0/1,inplace=Ture)
#行删除
数据帧名.dorp(要删除的索引值,inplace=True)

看起来区别很大,实际上是没有区别的,只不过是axis的值,控制了对行列的操作,而axis的默认正好是零(补充:在axis中,0表示对行,1表示对列操作操作)
labels=’‘之所以在行删除的时候没有写,因为这个属性就在函数的第一位。

inplace用来控制是否对元数据进行修改(不对元数据修改需要进行赋值)

索引选择

iloc选择,选择的是隐示的索引(系统底层的)
loc选择,先择的是显示的索引(你自己定的名字)
它们两个会返回指定行的数据,返回其实是一个 Series 数据。
也可以返回多行的数据,使用[[……]]格式,’……‘表示各行的索引,使用逗号隔开。(这里它返回的是一个DataFrame数据)。

文件读取

CSV文件读取

pd.read_csv(文件位置,encoding=’utf-8’,engine=’python’,header=数,delimiter’分隔的符号’)

encoding - 指定编码格式
engine - 表示的是处理数据的引擎
header - 从第几行开始(包含0)
delimiter-以什么符号分隔

Excel文件读取

pd.read_excel(‘工作簿的位置’,sheet_name=’工作表的名’)

sheet_name指定具体是工作簿的那个表

我们可以对数据进行一些判断的操作

data = {
  "A": [1,2,3],
  "B": [4,5,6]
}
df = pd.DataFrame(data, index = ["A", "B", "C"])
print(df['A']==1)
运行结果

它就会对这一列进行逐个判断,虽然我们只写了一个式子。然后输出一个布尔类型。由此我们可以衍生出来更多的表达式。

对上面的优化一下,我们可以输出符合的行的值。

data = {
  "A": [1,2,3],
  "B": [4,5,6]
}
df = pd.DataFrame(data, index = ["A", "B", "C"])
print(df[df['A']==1])
运行结果

数据量小,可能看不出俩太明显的结果,可自行增加数据量,进行尝试。这个代码块输出部分的含义是:从df中搜索,将里面所有符合条件的全部输出。

一般情况下,我们做 将符合条件输出 的操作的时候,都要做嵌套的工作,可以自行理解一下。并且,在方括号中,如果我们要进行 与(and) 或(or) 非(not) 的判断,要使用 与( & ) 或( | ) 非( ! ) 。

数据对象操作

数据对象.head(n)    #取数据的前几个,n默认是5
数据对象.tail(n)    #取数据的后几个,n默认是5

数据对象.head(n) 取数据的前n个,默认是5个
数据对象.tail(n) 取数据的后n个,默认是5个
数据对象.isin() 在某个列表里面(或者是集合当中)

缺省值

数据对象.isnull() 判断某一个位置是否为空,返回一个布尔值
数据对象.notnull() 不为空,有数据的时候显示的是True
数据对象.fillna() 填充缺省值,默认填充的是中位数
数据对象.dropna() 删除缺省值,默认对行进行删除

数据帧信息

df.info() 返回数据帧信息
df.describe() 返回统计学信息

分组

df[列名].value_counts() 分组计数/频数统计

df.sort_values([‘主列名’,……],ascending=[主列升降序 真/假 ,……])
ascending,是升序的意思

df.groupby(列名) 对数据进行分组

组对象.agg(聚合函数)[列索引] 对分组进行聚合操作

映射

映射可以使用函数,字典和匿名函数来操作

#函数方式
df[类名A]=df[类名A].map(自己写的函数/匿名函数)
#字典方式
df[类名A]=df[类名A].map({键:值})

如果字典的键,没有囊括所有内容,将会报错。