Dataframe
增减列、改列名
-
df = df.drop('列', axis = 1) 删除某列
-
df = df.join(x) cbind列在最后
-
df['新列名'] = 一个向量,创建新的一列
-
df.columns # 查看变量名
-
df.columns = ['A','B',...] ,把完整新列名赋值过去
-
df.rename(columns={'a':'A'}) ,只修改一个列名
## 将代码块运行结果全部输出,而不是只输出最后的,适用于全文
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
## 分类变量——转化为虚拟变量
import os
import pandas as pd
os.chdir("/Users/mac/Desktop/快乐研一/python/data")
gaokao = pd.read_csv("高考_numpy专用.csv")
gaokao.shape
boshi = gaokao['博士点']
## 列的删除&新增
gaokao = gaokao.drop('博士点', axis = 1) # 删除一列
gaokao.shape
gaokao = gaokao.join(boshi) # cbind一列
#gaokao['博士+1'] = boshi+1 # 新增一列
gaokao.shape
gaokao.head()
# 列名处理
gaokao.columns # 查看变量名
gaokao = gaokao.rename(columns = {'大学名称':"大学名"})
gaokao.head()
# 预处理
gaokao = gaokao.drop_duplicates(subset = ['大学名']) # 去重复
gaokao.dropna(axis=0, how='any', thresh = None, subset = None, inplace=True) # omit na值
(98, 5)
(98, 4)
(98, 5)
大学名称 | 类型 | 重点学科 | 分数线 | 博士点 | |
---|---|---|---|---|---|
0 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 |
1 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 |
2 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 |
3 | 复旦大学 | 综合 | 30.0 | 687.0 | 178.0 |
4 | 清华大学 | 综合 | 37.0 | 686.0 | 253.0 |
Index(['大学名称', '类型', '重点学科', '分数线', '博士点'], dtype='object')
大学名 | 类型 | 重点学科 | 分数线 | 博士点 | |
---|---|---|---|---|---|
0 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 |
1 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 |
2 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 |
3 | 复旦大学 | 综合 | 30.0 | 687.0 | 178.0 |
4 | 清华大学 | 综合 | 37.0 | 686.0 | 253.0 |
单列运算
- 方法1:可以用自定义函数:df['col'].map(FUNCTION)
- 方法2:更常用的基本运算!numpy中函数: np.xxx(df['列名'])
注意!np.mean(df,0)0表示按列计算,1表示按列计算
# 基本统计量
import numpy as np
gaokao.describe()
#np.cumsum(gaokao['重点学科']) # 列和
#np.var(gaokao) # 自动按列计算——variance
np.mean(gaokao,0) # 按列计算取0,按行计算取1
#np.log(gaokao['分数线']+1) # 对于一列取对数
重点学科 | 分数线 | 博士点 | |
---|---|---|---|
count | 91.000000 | 91.000000 | 91.000000 |
mean | 12.263736 | 596.000000 | 72.274725 |
std | 11.896624 | 36.016354 | 68.272992 |
min | 0.000000 | 530.000000 | 4.000000 |
25% | 4.000000 | 570.000000 | 20.500000 |
50% | 9.000000 | 589.000000 | 45.000000 |
75% | 16.500000 | 613.000000 | 108.500000 |
max | 81.000000 | 694.000000 | 283.000000 |
大学名 0.000000
类型 0.043956
重点学科 12.263736
分数线 596.000000
博士点 72.274725
dtype: float64
大小排序
df.sort_values(by="XXXX" , ascending=False) 默认由大到小
gaokao.sort_values(by = "分数线", ascending = False).iloc[0:5, [0,3]]
大学名 | 分数线 | |
---|---|---|
0 | 北京大学 | 694.0 |
3 | 复旦大学 | 687.0 |
4 | 清华大学 | 686.0 |
5 | 上海交通大学 | 664.0 |
7 | 南京大学 | 662.0 |
分类变量处理
table
- pd.unique(分类变量) 查看一共有哪些类型
- pd.value_counts(分类变量)查看各类型数量
pd.unique(gaokao["类型"]) # 查看一共有哪些类型
pd.value_counts(gaokao["类型"]) # 查看各类型数量
array(['综合', '师范', '工科', '医药', '农业', '民族', '林业'], dtype=object)
工科 41
综合 30
师范 10
农业 5
林业 2
医药 2
民族 1
Name: 类型, dtype: int64
分组统计
groupby+agg,可以再加上sort_values做排序
## 按照某分类变量——分组计算
gaokao.groupby(by = '类型').agg({'分数线': "mean"}).sort_values
<bound method DataFrame.sort_values of 分数线
类型
农业 577.400000
医药 594.000000
工科 590.487805
师范 578.700000
林业 591.000000
民族 612.000000
综合 612.333333>
连续变量分组
pd.cut(xxx, k/bins,labels = xxx)
- 直接给数字,做等分
- 或者自己设定bins
fenwei = gaokao['重点学科'].quantile(np.arange(0, 1.1, 0.25)) # 计算分位数
fenwei
bins = list(fenwei) # 把分位数作为分割处
gaokao['重点学科(分类)'] = pd.cut(gaokao['重点学科'], bins, labels = [u"四流",u"三流",u"二流",u"一流"]) # 按照指定bins划分
gaokao.head()
gaokao['重点学科(分类)'] = pd.cut(gaokao['重点学科'], 3, labels = [u"LOW",u"MED",u"TOP"]) # 直接三等分
gaokao['分数线高低'] = pd.cut(gaokao['分数线'], 2, labels = [u"低于平均",u"高于平均"]) # 对分数线做划分二等分
gaokao.head()
0.00 0.0
0.25 4.0
0.50 9.0
0.75 16.5
1.00 81.0
Name: 重点学科, dtype: float64
大学名 | 类型 | 重点学科 | 分数线 | 博士点 | 重点学科(分类) | |
---|---|---|---|---|---|---|
0 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 | 四流 |
3 | 复旦大学 | 综合 | 30.0 | 687.0 | 178.0 | 四流 |
4 | 清华大学 | 综合 | 37.0 | 686.0 | 253.0 | 四流 |
5 | 上海交通大学 | 综合 | 9.0 | 664.0 | 78.0 | 二流 |
7 | 南京大学 | 综合 | 21.0 | 662.0 | 44.0 | 四流 |
大学名 | 类型 | 重点学科 | 分数线 | 博士点 | 重点学科(分类) | |
---|---|---|---|---|---|---|
0 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 | LOW |
3 | 复旦大学 | 综合 | 30.0 | 687.0 | 178.0 | MED |
4 | 清华大学 | 综合 | 37.0 | 686.0 | 253.0 | MED |
5 | 上海交通大学 | 综合 | 9.0 | 664.0 | 78.0 | TOP |
7 | 南京大学 | 综合 | 21.0 | 662.0 | 44.0 | TOP |
虚拟变量
pd.get_dummies(分类变量, prefix="新列名前缀")
leixing = pd.get_dummies(gaokao.类型, prefix="type") # 全部生成虚拟变量,列名前面加上type
gaokao = gaokao.join(leixing) # join进原数据里
gaokao.head()
大学名 | 类型 | 重点学科 | 分数线 | 博士点 | 重点学科(分类) | type_农业 | type_医药 | type_工科 | type_师范 | type_林业 | type_民族 | type_综合 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 北京大学 | 综合 | 81.0 | 694.0 | 201.0 | LOW | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
3 | 复旦大学 | 综合 | 30.0 | 687.0 | 178.0 | MED | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
4 | 清华大学 | 综合 | 37.0 | 686.0 | 253.0 | MED | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
5 | 上海交通大学 | 综合 | 9.0 | 664.0 | 78.0 | TOP | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
7 | 南京大学 | 综合 | 21.0 | 662.0 | 44.0 | TOP | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
sklearn
1.Statsmodels(了解)
连续变量:
- √处理:异常值问题
- √描述:相关系数图
- √建模Statsmodels,回归
分类变量:
- √处理:哑变量处理 pandas.get_dummies
- √描述:箱线图、条形图
- √建模:方差分析与回归系数
回归检验:
- √回归拟合图、检验图
2.sklearn 机器学习(重点)
- 调用train_test_split()——切分训练集、验证集、测试集
- 模型初始化(针对模型各种参数的调整都是在这一步)
- 调用fit()——训练样本
- 调用score()——计算平均准确率。
- 结果展示
划分训练集和测试集
# 加载sklearn
from sklearn import tree
from sklearn.model_selection import train_test_split
# 读入火锅
data = pd.read_excel("https://github.com/xiangyuchang/xiangyuchang.github.io/blob/master/BearData/shops_nm_cleaned.xlsx?raw=true", encoding='utf8')
# 划分训练集、验证集、测试集
X_train, X_val, y_train, y_val = train_test_split(data.iloc[:, 1:-1], data.iloc[:, -1], test_size=0.3, random_state=0) #划分训练集与验证集
X_val, X_test, y_val, y_test = train_test_split(X_val, y_val, test_size=0.3, random_state=0) #划分验证集与测试集
print('训练集维度: {}, 验证集维度: {},测试集维度:{} \n'.format(y_train.shape, y_val.shape, y_test.shape))
训练集维度: (489,), 验证集维度: (147,),测试集维度:(63,)