dataframe&预处理

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,)