Python第三方库-Pandas总结

文章目录

  • 一、Pandas基础
    • 1.Series创建方式
    • 2.DataFrame三种创建方式
    • 3.索引相关函数
  • 二、Pandas处理Excel数据
    • 读取数据
    • 导出Pandas数据
    • 按照特定条件筛选
    • 查看数据出现的频次
    • 数据排序
    • 删除数据
    • 数据表拼接
  • 三、pandas数据预处理
    • 非数值型变量处理
    • 重复值、缺失值及异常值处理
    • 数据分箱
  • 四、pandas其他用法


一、Pandas基础

相较于Numpy来说,Pandas更擅长处理二维数据。Pandas主要有两种数据结构:SeriesDataFrame。Series类似于通过Numpy产生的一维数组,不同的是Series对象不仅包含数值,还包含一组索引。

1.Series创建方式

import pandas as pd
pd.Series(['张三','李四', '王五'])

2.DataFrame三种创建方式

有三种DataFrame常见的创建方法:通过列表创建、通过字典创建及通过二维数组创建。

# (1)通过列表创建DataFrame,并自定义其列索引和行索引名称
a = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=['date', 'score'], index=['A', 'B', 'C'])

# 通过列表生成DataFrame还可以先创建一个空DataFrame,再输入数据
a = pd.DataFrame()
date = [1, 3, 5]
score = [2, 4, 6]
a['date'] = date
a['score'] = score
# (2)通过字典创建DataFrame,默认情况下字典的键是列索引
b = pd.DataFrame({'a': [1, 3, 5], 'b': [2, 4, 6]}, index=['x', 'y', 'z'])

# 可以通过.T来对表格进行转置
b.T
# (3)通过Numpy产生的二维数组创建DataFrame
import numpy as np
c = pd.DataFrame(np.arange(12).reshape(3,4), index=[1, 2, 3], columns=['A', 'B', 'C', 'D'])

3.索引相关函数

# 通过rename之后需要重新赋值给a才能改变原表格;
a = a.rename(index={'A':'阿里', 'B':'腾讯', 'C':'字节'}, columns={'date':'日期','score':'分数'})
# 或者在rename()中设置inplace参数为True
a.rename(index={'A':'阿里', 'B':'腾讯', 'C':'字节'}, columns={'date':'日期','score':'分数'},inplace=True)
# set_index()函数将某列设置为索引
a = a.set_index('日期')
# reset_index()函数将行索引换成数字索引
a = a.reset_index()
# 给行索引命名
a.index.name = '公司'
# .values属性查看index值
a.index.values

二、Pandas处理Excel数据

读取数据

# 读取.csv数据
data = pd.read_csv('data.csv', delimiter=',', encoding='utf-8')
# 读取Excel数据
# data = pd.read_excel('data.xlsx')

导出Pandas数据

# 将DataFrame导入到Excel当中
data.to_excel('data_new.xlsx')
# to_excel的常见参数:sheet_name:数据表名;index:True or False,默认为True保存索引信息,即输出文件的第一列为索引值,选择False的话则忽略索引信息;encoding:编码方式。

data.to_excel('data_new.xlsx', index=False)

# 通过类似的方式,可以将数据写入到CSV文件当中,代码如下:
data.to_csv('演示.csv', index=False, encoding="utf_8_sig")

按照特定条件筛选

# 有多个筛选条件可以通过“&”符号(表示“且”)或“|”(表示“或”)连接
data[(data['c1'] > 1) & (data['c2'] < 8)]
num = [100, 200, 300]
data[data.A.isin(num)]     #筛选出A列值在num列表的数据

查看数据出现的频次

# 通过value_counts()函数快速的查看某一列都有什么数据,以及该数据出现的频次
data['c1'].value_counts()

数据排序

# sort_values()根据列对数据进行排序,比如要对c1列进行降序排序
a = data.sort_values(by='c1', ascending=False) 
# 对c1,c2列进行升序,降序排序
data.sort_values(by=['c1', 'c2'], ascending=[True, False], inplace=True)
# 此外,通过sort_index()可以根据行索引进行排序,默认按行索引进行升序排列
a = a.sort_index()
a

删除数据

# 删除c1列的数据
a = data.drop(columns='c1')
a

# 删除多列的数据
b = data.drop(columns=['c1', 'c3'])
b

# 如果要删除行数据
c = data.drop(index=['r1','r3'])
c

# 或者传入inplace参数
data.drop(index=['r1','r3'], inplace=True)
data

数据表拼接

# 假设有如下两个DataFrame表格,需要对它们进行合并:
import pandas as pd
df1 = pd.DataFrame({'公司': ['万科', '阿里', '百度'], '分数': [90, 95, 85]})
df2 = pd.DataFrame({'公司': ['万科', '阿里', '京东'], '股价': [20, 180, 30]})

1.merge()

# merge()函数根据一个或多个键将不同表格中的行连接起来,示例如下:
df3 = pd.merge(df1, df2) #默认的合并是取交集(inner连接)

# 设置how参数,取并集(outer连接),即选取两表所有的内容
df4 = pd.merge(df1, df2, how='outer')

# 如果想保留左表全部内容,而对右表不太在意的话,将how参数设置为left
df5 = pd.merge(df1, df2, how='left')

2.join()

# 注意在通过join()函数进行拼接的时候,两张表格中不能有名字相同的列名,如果存在的话,则需要设置lsuffix参数(左表同名列的后缀,suffix的中文翻译就是后缀的意思,l表示left)和rsuffix参数(右表同名列的后缀,这里的r表示right),没有相同列名的话,则可以直接写df1.join(df2)
df6 = df1.join(df2, lsuffix='_x', rsuffix='_y')

3.concat()

# 默认情况下,axis=0,按行方向进行连接。
# 此时行索引为原来两张表各自的索引,设置ignore_index=True,忽略原有索引,按新数字索引进行排序。
df7 = pd.concat([df1,df2], axis=0,ignore_index=True)

4.append()

df8 = df1.append(df2)

# append()函数可用来新增元素,和列表.append()一样
df9 = df1.append({'公司': '腾讯', '分数': '90'}, ignore_index=True)

三、pandas数据预处理

非数值型变量处理

1.Get_dummies哑变量处理

import pandas as pd
df = pd.DataFrame({'客户编号': [1, 2, 3,4], '性别': ['男', '女', '男',"女"]})

# 方法一:这种方法会把性别那一列分为两列,为防止特征之间相关性太强,需要删掉一列,删除之后再修改列名
df = pd.get_dummies(df, columns=['性别'])
df = df.drop(columns='性别_1')
df = df.rename(columns={'性别_0':'性别'})

# 非数值型变量只有两类时:比如‘男’,‘女’,可以直接用第二种方法,但是两个以上的只能用第一种
# 方法二:性别那一列男和女直接变为1和0,无需删除改列名操作
df["性别"] = pd.get_dummies(df['性别'])

2.Label Encoding编号处理

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame({'编号': [1, 2, 3, 4, 5], '城市': ['北京', '上海', '广州', '深圳', '北京']})
le = LabelEncoder()
df['城市'] = le.fit_transform(df['城市'])

3.replace()函数

df['城市'] = df['城市'].replace({'北京': 0, '上海': 1, '广州': 2, '深圳':3})

总结:Get_dummies的优点就是它的值只有0和1,缺点是当类别的数量很多时,特征维度会很高。如果类别数目不多时可以优先考虑Get_dummies,其次考虑Label Encoding或replace()函数。

重复值、缺失值及异常值处理

1.删除重复值

import pandas as pd
data = pd.DataFrame([[1, 2, 3], [1, 2, 3], [4, 5, 6]], columns=['c1', 'c2', 'c3'])

# 数据量较大时通过duplicated()函数来查询重复的内容
data[data.duplicated()]

# sum()函数统计重复行的数量
data.duplicated().sum()

# drop_duplicates()函数删除重复行
data = data.drop_duplicates()

# 如果想按列进行去重,比如说如果c1列出现相同的内容,就把那行删掉
data = pd.DataFrame([[1, 2, 3], [1, 1, 1], [4, 5, 6]], columns=['c1', 'c2', 'c3'])
data = data.drop_duplicates('c1')

2.缺失值处理

  • 查看缺失值
import numpy as np
data = pd.DataFrame([[1, np.nan, 3], [np.nan, 2, np.nan], [1, np.nan, 0]], columns=['c1', 'c2', 'c3'])

# 用isnull()函数或isna()函数查看空值
data.isnull()

# 当数据量较大时筛选某列内容为空值的行
data[data['c1'].isnull()]
  • 缺失值处理:删除空值和填补空值
# dropna(axis = 0,inpalce=Flase)函数删除空值,#默认删除行
a = data.dropna()

# 如果觉得该删除方法过于激进,可以设置thresh参数,设置为n含义是如果该行的非空值少于n个则删除该行
b = data.dropna(thresh=2)
# finllna()函数填补空值
c = data.fillna(data.mean())#通过每一列的均值对该列的空值进行填充
# c = data.fillna(data.meian())

# method='pad'代表用缺失值所在列的前一个值填充,如果前一个值不存在或也缺失,则结果不变
d = data.fillna(method='pad')

# method='backfill'或method='bfill'用缺失值所在列的后一个值填充,如果后一个值不存在或也缺失,则结果不变。
e = data.fillna(method='backfill')
# e = data.fillna(method='bfill')

3.异常值处理

data = pd.DataFrame({'c1': [3, 10, 5, 7, 1, 9, 69], 'c2': [15, 16, 14, 100, 19, 11, 8], 'c3': [20, 15, 18, 21, 120, 27, 29]}, columns=['c1', 'c2', 'c3'])

# 利用箱型图观察异常值,再删除异常值
data.boxplot()  

数据分箱

import pandas as pd
data = pd.DataFrame([[22,1],[25,1],[20,0],[35,0],[32,1],[38,0],[50,0],[46,1]], columns=['年龄', '是否违约'])

# 等宽分箱,将年龄分为等宽的3⃣️箱
data_cut = pd.cut(data['年龄'], 3)

# 分箱并进行编号
pd.cut(data['年龄'], 3, labels=[1, 2, 3])

# 通过groupby()函数进行分组,count()函数行计数可以获取每个分箱中的样本数目
data['年龄'].groupby(data_cut).count()

groupby()用法

import pandas as pd
data = pd.DataFrame([['战狼2', '丁一', 6, 8], ['攀登者', '王二', 8, 6], ['攀登者', '张三', 10, 8], ['卧虎藏龙', '李四', 8, 8], ['卧虎藏龙', '赵五', 8, 10]], columns=['电影名称', '影评师', '观前评分', '观后评分'])

means = data.groupby('电影名称')[['观前评分', '观后评分']].mean()

means = data.groupby(['电影名称', '影评师'])[['观后评分']].mean()

count = data.groupby('电影名称')[['观后评分']].count()

四、pandas其他用法

df = pd.DataFrame([[1, 2, 3],\
                   [4, 5, 6],\
                   [7, 8, 9]], columns=['A', 'B', 'C'])
df.agg(["mean", "min", max])
"""
	A	B	C
mean 4.0 5.0 6.0
min	1.0	2.0	3.0
max	7.0	8.0	9.0
"""

你可能感兴趣的:(Python-SQL,python,数据挖掘,数据分析)