目录
2.4、异常值处理 replace【异常值不是NaN,是基于经验判断不可能出现的数据】
2.5.4、填充空值[可以先用replace替换为NaN然后使用fillna]
2.7、哑变量处理(独热编码)★ pd.get_dummies
五、Pandas里面有针对三种特定的数据类型的独有属性和方法
NLP Numpy、Pandas、Scikit-learn资料:
NLP Numpy、Pandas、Scikit-learn资料下载
一、读取MySqL表格数据【Python 读取MySQL】
- 第一种读取 sql 文件的方式:
# 使用pymysql【 pip install pymysql 】 读取 sql 文件
import pymysql
conn1 = pymysql.connect(host="localhost", user="root", passwd="", db="pandas_test", charset='utf8')
# tip: pymysql 有时可能会报错,不推荐使用
- 第二种读取 sql 文件的方式:
# 使用 sqlalchemy【 pip install sqlalchemy 】读取sql文件,推荐使用这种方式
# 建立连接
db_info = {
'user':'root',
'password':'',
'host':'localhost',
'database':'pandas_test' # 这里我们事先指定了数据库,后续操作只需要表即可
}
# 推荐使用,可设置参数echo=True,会显示在加载数据库所执行的SQL语句
conn2 = create_engine('mysql+pymysql://%(user)s:%(password)s@%(host)s/%(database)s?charset=utf8' % db_info,
encoding='utf-8')
# 读取数据表格1
sql_1 = "select * from 成绩单1"
data_table_1 = pd.read_sql(sql_1, conn2)
data_table_1
out:
姓名 学科 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
4 露西 数学 100.0 金牛 None
5 韩梅梅 语文 95.0 白羊 None
6 李雷 语文 95.0 射手 None
7 李莉 语文 886.0 天蝎 None
8 露西 语文 51.0 金牛 None
9 露西 None 6.0 金牛 None
10 张三 体育 NaN 天秤 None
# 读取数据表格2
sql_2 = "select * from 成绩单2"
data_table_2 = pd.read_sql(sql_2,conn2)
data_table_2
out:
姓名 学科 成绩 星座 血型
0 韩梅梅 英语 88 白羊 None
1 李雷 英语 99 射手 None
2 李莉 英语 93 天蝎 None
3 露西 英语 20 金牛 None
tip:上面两个表示这篇文章演示数据
二、数据处理★
2.1、表格拼接 concat
combined_data_table = pd.concat([data_table_1, data_table_2], axis=0, sort=True, ignore_index=True)
"""
axis=0, 沿着0轴进行拼接
sort=True, True 表示重新排序
ignore_index=True 忽略这些表原始的行索引
"""
combined_data_table
out:
姓名 学科 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
4 露西 数学 100.0 金牛 None
5 韩梅梅 语文 95.0 白羊 None
6 李雷 语文 95.0 射手 None
7 李莉 语文 886.0 天蝎 None
8 露西 语文 51.0 金牛 None
9 露西 None 6.0 金牛 None
10 张三 体育 NaN 天秤 None
11 韩梅梅 英语 88.0 白羊 None
12 李雷 英语 99.0 射手 None
13 李莉 英语 93.0 天蝎 None
14 露西 英语 20.0 金牛 None
2.2、去重 drop_duplicates
# 按整条记录进行去重【两行数据所有的列完全相同时才进行去重】,默认只能保存第一个观测值,如果保留最后一个观测值需要添加参数:keep = 'last'
combined_data_table.drop_duplicates(inplace=True)
combined_data_table
out:
姓名 学科 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
5 韩梅梅 语文 95.0 白羊 None
6 李雷 语文 95.0 射手 None
7 李莉 语文 886.0 天蝎 None
8 露西 语文 51.0 金牛 None
9 露西 None 6.0 金牛 None
10 张三 体育 NaN 天秤 None
11 韩梅梅 英语 88.0 白羊 None
12 李雷 英语 99.0 射手 None
13 李莉 英语 93.0 天蝎 None
14 露西 英语 20.0 金牛 None
# 按照某些列进行重复判断进行去重,默认只能保存第一个观测值,如果保留最后一个观测值需要添加参数:keep = 'last'
combined_data_table = combined_data_table.drop_duplicates(["星座"])
out:
姓名 学科 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
10 张三 体育 NaN 天秤 None
2.3、使用函数或者映射进行数据转换 map
# 数据
import pandas as pd
datas = pd.DataFrame({'food':['bacon','pulled pork','bacon','Pastrami','corned beef','Bacon','pastrami','honey ham','nova lox'],'ounces':[4,3,12,6,7.5,8,3,5,6]})
print(datas)
out:
food ounces
0 bacon 4.0
1 pulled pork 3.0
2 bacon 12.0
3 Pastrami 6.0
4 corned beef 7.5
5 Bacon 8.0
6 pastrami 3.0
7 honey ham 5.0
8 nova lox 6.0
传入字典:假设给定一个 ‘食物’:‘动物’ 的字典,请添加一列用于表示每种食物的动物肉类型。
food2animal = {
'bacon':'pig',
'pulled pork':'pig',
'pastrami':'cow',
'corned beef':'cow',
'honey ham':'pig',
'nova lox':'salmon'
}
lower_datas = datas['food'].str.lower() # 利用 pd.str 中的方法
datas['animals'] = lower_datas.map(food2animal)
print(datas)
out:
food ounces animals
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
传入函数:可以完成上述所有的工作
food2animal = {
'bacon':'pig',
'pulled pork':'pig',
'pastrami':'cow',
'corned beef':'cow',
'honey ham':'pig',
'nova lox':'salmon'
}
datas['ANIMALS'] = datas['food'].map(lambda x:food2animal[x.lower()])
print(datas)
out:
food ounces ANIMALS
0 bacon 4.0 pig
1 pulled pork 3.0 pig
2 bacon 12.0 pig
3 Pastrami 6.0 cow
4 corned beef 7.5 cow
5 Bacon 8.0 pig
6 pastrami 3.0 cow
7 honey ham 5.0 pig
8 nova lox 6.0 salmon
2.4、异常值处理 replace【异常值不是NaN,是基于经验判断不可能出现的数据】
- 异常值替换 relace
# 源数据
import pandas as pd
import numpy as np
data = pd.Series([1.,-999,2,2,-999,-1000,3])
print(data)
out:
0 1.0
1 -999.0
2 2.0
3 2.0
4 -999.0
5 -1000.0
6 3.0
替换一个值
tmp1 = data.replace(-999,np.nan)
print(tmp1)
out:
0 1.0
1 NaN
2 2.0
3 2.0
4 NaN
5 -1000.0
6 3.0
dtype: float64
一次替换多个值
tmp2 = data.replace([-999,-1000],np.nan)
print(tmp2)
out:
0 1.0
1 NaN
2 2.0
3 2.0
4 NaN
5 NaN
6 3.0
dtype: float64
tmp3 = data.replace([-999,-1000],['aaa','ccc'])
print(tmp3)
out:
0 1
1 aaa
2 2
3 2
4 aaa
5 ccc
6 3
dtype: object
使用字典替换多个值
tmp4 = data.replace({-999:'a3',-1000:'c3'})
print(tmp4)
out:
0 1
1 a3
2 2
3 2
4 a3
5 c3
6 3
dtype: object
- 异常值删除【使用bool索引与drop的方式删除】
import pandas as pd
import numpy as np
combined_data_table = pd.DataFrame({'姓名':["韩梅梅","李雷","李莉","露西","露西","韩梅梅","李雷","李莉","露西","露西","张三","韩梅梅","李雷","李莉","露西"],
'科目':["数学","数学","数学","数学","数学","语文","语文","语文","语文",None,"体育","英语","英语","英语","英语"],
'成绩':[59.0,59.0,60.0,100.0,100.0,95.0,95.0,886.0,51.0,6.0,None,88.0,99.0,98,87],
'星座':["白羊",'射手',"天蝎","金牛","金牛","白羊","射手","天蝎","金牛","金牛","天秤","白羊","射手","天蝎","金牛"],
'血型':[None,None,None,None,None,None,None,None,None,None,None,None,None,None,None]})
out:
姓名 科目 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
4 露西 数学 100.0 金牛 None
5 韩梅梅 语文 95.0 白羊 None
6 李雷 语文 95.0 射手 None
7 李莉 语文 886.0 天蝎 None
8 露西 语文 51.0 金牛 None
9 露西 None 6.0 金牛 None
10 张三 体育 NaN 天秤 None
11 韩梅梅 英语 88.0 白羊 None
12 李雷 英语 99.0 射手 None
13 李莉 英语 98.0 天蝎 None
14 露西 英语 87.0 金牛 None
# 查看成绩列是否有小于0或大于100的值
outliers_bool_sr = (combined_data_table["成绩"] < 0) | (combined_data_table["成绩"] > 100)
outliers_bool_sr
out:
0 False
1 False
2 False
3 False
5 False
6 False
7 True
8 False
9 False
10 False
11 False
12 False
13 False
14 False
Name: 成绩, dtype: bool
# 异常值个数
sum(outliers_bool_sr)
out:
1
# 异常值的行标签
combined_data_table.loc[outliers_bool_sr].index
out:
Int64Index([7], dtype='int64')
# 异常值删除处理
combined_data_table = combined_data_table.drop(combined_data_table.loc[(combined_data_table["成绩"] < 0) | (combined_data_table["成绩"] > 100)].index)
print(combined_data_table)
out:
姓名 科目 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
4 露西 数学 100.0 金牛 None
5 韩梅梅 语文 95.0 白羊 None
6 李雷 语文 95.0 射手 None
8 露西 语文 51.0 金牛 None
9 露西 None 6.0 金牛 None
10 张三 体育 NaN 天秤 None
11 韩梅梅 英语 88.0 白羊 None
12 李雷 英语 99.0 射手 None
13 李莉 英语 98.0 天蝎 None
14 露西 英语 87.0 金牛 None
2.5、空值NaN处理★
2.5.1、检查缺失值(isnull和notnull)
# isnull
print(combined_data_table.isnull())
out:
姓名 科目 成绩 星座 血型
0 False False False False True
1 False False False False True
2 False False False False True
3 False False False False True
4 False False False False True
5 False False False False True
6 False False False False True
8 False False False False True
9 False True False False True
10 False False True False True
11 False False False False True
12 False False False False True
13 False False False False True
14 False False False False True
print(combined_data_table.isnull().sum()) # 统计每一列中有多少空数据
out:
姓名 0
科目 1
成绩 1
星座 0
血型 14
dtype: int64
print(combined_data_table.loc[combined_data_table['成绩'].isnull()].index) # 找出 空值 所在的索引位置
out:
Int64Index([10], dtype='int64')
# isnull
print(combined_data_table.isnull())
out:
姓名 科目 成绩 星座 血型
0 True True True True False
1 True True True True False
2 True True True True False
3 True True True True False
4 True True True True False
5 True True True True False
6 True True True True False
8 True True True True False
9 True False True True False
10 True True False True False
11 True True True True False
12 True True True True False
13 True True True True False
14 True True True True False
print(combined_data_table.isnull().sum()) # 统计每一列中有多少空数据
out:
姓名 14
科目 13
成绩 13
星座 14
血型 0
dtype: int64
2.5.2、删除全为空的列 dropna()
print(combined_data_table)
out:
姓名 科目 成绩 星座 血型
0 韩梅梅 数学 59.0 白羊 None
1 李雷 数学 59.0 射手 None
2 李莉 数学 60.0 天蝎 None
3 露西 数学 100.0 金牛 None
4 露西 数学 100.0 金牛 None
5 韩梅梅 语文 95.0 白羊 None
6 李雷 语文 95.0 射手 None
8 露西 语文 51.0 金牛 None
9 露西 None 6.0 金牛 None
10 张三 体育 NaN 天秤 None
11 韩梅梅 英语 88.0 白羊 None
12 李雷 英语 99.0 射手 None
13 李莉 英语 98.0 天蝎 None
14 露西 英语 87.0 金牛 None
combined_data_table = combined_data_table.dropna(axis=1,how='all')
print(combined_data_table)
out:
姓名 科目 成绩 星座
0 韩梅梅 数学 59.0 白羊
1 李雷 数学 59.0 射手
2 李莉 数学 60.0 天蝎
3 露西 数学 100.0 金牛
4 露西 数学 100.0 金牛
5 韩梅梅 语文 95.0 白羊
6 李雷 语文 95.0 射手
8 露西 语文 51.0 金牛
9 露西 None 6.0 金牛
10 张三 体育 NaN 天秤
11 韩梅梅 英语 88.0 白羊
12 李雷 英语 99.0 射手
13 李莉 英语 98.0 天蝎
14 露西 英语 87.0 金牛
2.5.3、删除有空值的行 dropna()
print(combined_data_table)
out:
姓名 科目 成绩 星座
0 韩梅梅 数学 59.0 白羊
1 李雷 数学 59.0 射手
2 李莉 数学 60.0 天蝎
3 露西 数学 100.0 金牛
4 露西 数学 100.0 金牛
5 韩梅梅 语文 95.0 白羊
6 李雷 语文 95.0 射手
8 露西 语文 51.0 金牛
9 露西 None 6.0 金牛
10 张三 体育 NaN 天秤
11 韩梅梅 英语 88.0 白羊
12 李雷 英语 99.0 射手
13 李莉 英语 98.0 天蝎
14 露西 英语 87.0 金牛
print(combined_data_table.dropna(axis=0,how='any'))
out:
姓名 科目 成绩 星座
0 韩梅梅 数学 59.0 白羊
1 李雷 数学 59.0 射手
2 李莉 数学 60.0 天蝎
3 露西 数学 100.0 金牛
4 露西 数学 100.0 金牛
5 韩梅梅 语文 95.0 白羊
6 李雷 语文 95.0 射手
8 露西 语文 51.0 金牛
11 韩梅梅 英语 88.0 白羊
12 李雷 英语 99.0 射手
13 李莉 英语 98.0 天蝎
14 露西 英语 87.0 金牛
2.5.4、填充空值[可以先用replace替换为NaN然后使用fillna]
print(combined_data_table)
out:
姓名 科目 成绩 星座
0 韩梅梅 数学 59.0 白羊
1 李雷 数学 59.0 射手
2 李莉 数学 60.0 天蝎
3 露西 数学 100.0 金牛
4 露西 数学 100.0 金牛
5 韩梅梅 语文 95.0 白羊
6 李雷 语文 95.0 射手
8 露西 语文 51.0 金牛
10 张三 体育 NaN 天秤
11 韩梅梅 英语 88.0 白羊
12 李雷 英语 99.0 射手
13 李莉 英语 98.0 天蝎
14 露西 英语 87.0 金牛
# 为该条记录填充语文的平均成绩
chinese_mean_score = combined_data_table.loc[combined_data_table["学科"]=="语文", "成绩"].mean()
combined_data_table["成绩"].fillna(chinese_mean_score, inplace=True)
combined_data_table
out:
姓名 科目 成绩 星座
0 韩梅梅 数学 59.0 白羊
1 李雷 数学 59.0 射手
2 李莉 数学 60.0 天蝎
3 露西 数学 100.0 金牛
4 露西 数学 100.0 金牛
5 韩梅梅 语文 95.0 白羊
6 李雷 语文 95.0 射手
8 露西 语文 51.0 金牛
11 韩梅梅 英语 88.0 白羊
12 李雷 英语 99.0 射手
13 李莉 英语 98.0 天蝎
14 露西 英语 87.0 金牛
2.5.5、去除整一行全部都是0的数据(利用bool索引)
# 去除整个行都为0的行
bool_index_1 = (pivot_table_2!=0).sum(axis=1)>0
pivot_table_2 = pivot_table_2.loc[bool_index_1]
2.6、数据标准化★
2.6.1、离差标准化
combined_data_table
out:
姓名 学科 成绩 星座
0 韩梅梅 数学 59.000000 白羊
1 李雷 数学 59.000000 射手
2 李莉 数学 60.000000 天蝎
3 露西 数学 100.000000 金牛
5 韩梅梅 语文 95.000000 白羊
6 李雷 语文 95.000000 射手
8 露西 语文 51.000000 金牛
10 张三 体育 80.333333 天秤
11 韩梅梅 英语 88.000000 白羊
12 李雷 英语 99.000000 射手
13 李莉 英语 93.000000 天蝎
14 露西 英语 20.000000 金牛
combined_data_table["离差标准化成绩"] = (combined_data_table["成绩"] - combined_data_table["成绩"].min()) \
/ (combined_data_table["成绩"].max() - combined_data_table["成绩"].min())
combined_data_table
out:
姓名 学科 成绩 星座 离差标准化成绩
0 韩梅梅 数学 59.000000 白羊 0.487500
1 李雷 数学 59.000000 射手 0.487500
2 李莉 数学 60.000000 天蝎 0.500000
3 露西 数学 100.000000 金牛 1.000000
5 韩梅梅 语文 95.000000 白羊 0.937500
6 李雷 语文 95.000000 射手 0.937500
8 露西 语文 51.000000 金牛 0.387500
10 张三 体育 80.333333 天秤 0.754167
11 韩梅梅 英语 88.000000 白羊 0.850000
12 李雷 英语 99.000000 射手 0.987500
13 李莉 英语 93.000000 天蝎 0.912500
14 露西 英语 20.000000 金牛 0.000000
2.6.2、标准差标准化【相比较为常用,无量纲化】
combined_data_table["标准差标准化成绩"] = (combined_data_table["成绩"] - combined_data_table["成绩"].mean()) \
/ combined_data_table["成绩"].std()
combined_data_table
out:
姓名 学科 成绩 星座 离差标准化成绩 标准差标准化成绩
0 韩梅梅 数学 59.000000 白羊 0.487500 -0.638456
1 李雷 数学 59.000000 射手 0.487500 -0.638456
2 李莉 数学 60.000000 天蝎 0.500000 -0.598413
3 露西 数学 100.000000 金牛 1.000000 1.003288
5 韩梅梅 语文 95.000000 白羊 0.937500 0.803075
6 李雷 语文 95.000000 射手 0.937500 0.803075
8 露西 语文 51.000000 金牛 0.387500 -0.958796
10 张三 体育 80.333333 天秤 0.754167 0.215785
11 韩梅梅 英语 88.000000 白羊 0.850000 0.522777
12 李雷 英语 99.000000 射手 0.987500 0.963245
13 李莉 英语 93.000000 天蝎 0.912500 0.722990
14 露西 英语 20.000000 金牛 0.000000 -2.200114
2.7、哑变量处理(独热编码)★ pd.get_dummies
one_hot_features = pd.get_dummies(combined_data_table["星座"])
one_hot_features
out:
天秤 天蝎 射手 白羊 金牛
0 0 0 0 1 0
1 0 0 1 0 0
2 0 1 0 0 0
3 0 0 0 0 1
5 0 0 0 1 0
6 0 0 1 0 0
8 0 0 0 0 1
10 1 0 0 0 0
11 0 0 0 1 0
12 0 0 1 0 0
13 0 1 0 0 0
14 0 0 0 0 1
processed_data_table = pd.concat([combined_data_table, one_hot_features], axis=1)
processed_data_table
out:
姓名 学科 成绩 星座 离差标准化成绩 标准差标准化成绩 天秤 天蝎 射手 白羊 金牛
0 韩梅梅 数学 59.000000 白羊 0.487500 -0.638456 0 0 0 1 0
1 李雷 数学 59.000000 射手 0.487500 -0.638456 0 0 1 0 0
2 李莉 数学 60.000000 天蝎 0.500000 -0.598413 0 1 0 0 0
3 露西 数学 100.000000 金牛 1.000000 1.003288 0 0 0 0 1
5 韩梅梅 语文 95.000000 白羊 0.937500 0.803075 0 0 0 1 0
6 李雷 语文 95.000000 射手 0.937500 0.803075 0 0 1 0 0
8 露西 语文 51.000000 金牛 0.387500 -0.958796 0 0 0 0 1
10 张三 体育 80.333333 天秤 0.754167 0.215785 1 0 0 0 0
11 韩梅梅 英语 88.000000 白羊 0.850000 0.522777 0 0 0 1 0
12 李雷 英语 99.000000 射手 0.987500 0.963245 0 0 1 0 0
13 李莉 英语 93.000000 天蝎 0.912500 0.722990 0 1 0 0 0
14 露西 英语 20.000000 金牛 0.000000 -2.200114 0 0 0 0 1
2.8、批量操作★ apply() agg()
- .apply() 批量操作
# 每个元素进行相同操作
print(processed_data_table["星座"].apply(lambda x: x+"座"))
out:
0 白羊座
1 射手座
2 天蝎座
3 金牛座
5 白羊座
6 射手座
8 金牛座
10 天秤座
11 白羊座
12 射手座
13 天蝎座
14 金牛座
Name: 星座, dtype: object
def func(string):
return string+"座"
print(processed_data_table["星座"].apply(func))
out:
0 白羊座
1 射手座
2 天蝎座
3 金牛座
5 白羊座
6 射手座
8 金牛座
10 天秤座
11 白羊座
12 射手座
13 天蝎座
14 金牛座
Name: 星座, dtype: object
- .agg() 批量列聚合操作
# 整列合并计算
processed_data_table.agg({"成绩": np.mean, "星座": 'mode'}) # "mode" 众数【频率最高的,如果有多个则返回多个】
out:
成绩 星座
0 74.944444 射手
1 74.944444 白羊
2 74.944444 金牛
三、分组聚合统计 groupby()
# 分组后得到分组对象
groupby_res = processed_data_table.groupby(by=["学科"], axis=0)
groupby_res
out:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000000008E1D7F0>
# 对分组结果进行还原【同时也可以使用 for 循环查看】
groupby_res.apply(lambda x: x)
out:
姓名 学科 成绩 星座 离差标准化成绩 标准差标准化成绩 天秤 天蝎 射手 白羊 金牛
0 韩梅梅 数学 59.000000 白羊 0.487500 -0.638456 0 0 0 1 0
1 李雷 数学 59.000000 射手 0.487500 -0.638456 0 0 1 0 0
2 李莉 数学 60.000000 天蝎 0.500000 -0.598413 0 1 0 0 0
3 露西 数学 100.000000 金牛 1.000000 1.003288 0 0 0 0 1
5 韩梅梅 语文 95.000000 白羊 0.937500 0.803075 0 0 0 1 0
6 李雷 语文 95.000000 射手 0.937500 0.803075 0 0 1 0 0
8 露西 语文 51.000000 金牛 0.387500 -0.958796 0 0 0 0 1
10 张三 体育 80.333333 天秤 0.754167 0.215785 1 0 0 0 0
11 韩梅梅 英语 88.000000 白羊 0.850000 0.522777 0 0 0 1 0
12 李雷 英语 99.000000 射手 0.987500 0.963245 0 0 1 0 0
13 李莉 英语 93.000000 天蝎 0.912500 0.722990 0 1 0 0 0
14 露西 英语 20.000000 金牛 0.000000 -2.200114 0 0 0 0 1
对分组的结果进行聚合统计
# 分组统计均值
groupby_res.apply(lambda x: x.mean())
out:
学科 成绩 离差标准化成绩 标准差标准化成绩 天秤 天蝎 射手 白羊 金牛
体育 80.333333 0.754167 0.215785 1.0 0.00 0.000000 0.000000 0.000000
数学 69.500000 0.618750 -0.218009 0.0 0.25 0.250000 0.250000 0.250000
英语 75.000000 0.687500 0.002225 0.0 0.25 0.250000 0.250000 0.250000
语文 80.333333 0.754167 0.215785 0.0 0.00 0.333333 0.333333 0.333333
# 利用分组groupy 与 apply 对某一列数据进行多种计算
def func(group):
return {'min':group.min(),'max':group.max(),'mean':group.mean()}
print(groupby_res["成绩"].apply(func).unstack())
对分组的结果批量列进行聚合统计
# 分组差别化统计
groupby_res.agg({"姓名": 'count', "成绩": 'mean'})
out:
学科 姓名 成绩
体育 1 80.333333
数学 4 69.500000
英语 4 75.000000
语文 3 80.333333
四、输出MySQL数据表 .to_sql()
processed_data_table
out:
姓名 学科 成绩 星座 离差标准化成绩 标准差标准化成绩 天秤 天蝎 射手 白羊 金牛
0 韩梅梅 数学 59.000000 白羊 0.487500 -0.638456 0 0 0 1 0
1 李雷 数学 59.000000 射手 0.487500 -0.638456 0 0 1 0 0
2 李莉 数学 60.000000 天蝎 0.500000 -0.598413 0 1 0 0 0
3 露西 数学 100.000000 金牛 1.000000 1.003288 0 0 0 0 1
5 韩梅梅 语文 95.000000 白羊 0.937500 0.803075 0 0 0 1 0
6 李雷 语文 95.000000 射手 0.937500 0.803075 0 0 1 0 0
8 露西 语文 51.000000 金牛 0.387500 -0.958796 0 0 0 0 1
10 张三 体育 80.333333 天秤 0.754167 0.215785 1 0 0 0 0
11 韩梅梅 英语 88.000000 白羊 0.850000 0.522777 0 0 0 1 0
12 李雷 英语 99.000000 射手 0.987500 0.963245 0 0 1 0 0
13 李莉 英语 93.000000 天蝎 0.912500 0.722990 0 1 0 0 0
14 露西 英语 20.000000 金牛 0.000000 -2.200114 0 0 0 0 1
# 保存为sql文件
processed_data_table.to_sql('after_processed', conn, index=False, if_exists='append')
"""
index=False, 舍弃原表的行索引
if_exists='append' 如果表存在使用 “添加” 的操作
"""
五、Pandas里面有针对三种特定的数据类型的独有属性和方法
str:pandas.str.xxx
datetime: pandas.dt.xxx
category: pandas.cat.xxx
参考资料:https://zhuanlan.zhihu.com/p/44256257
- category 种类、类别
import pandas as pd
import numpy as np
ser = pd.Series(['yellow','red','write','black','red','yellow','red','yellow'])
print(ser)
out:
0 yellow
1 red
2 write
3 black
4 red
5 yellow
6 red
7 yellow
dtype: object
ser = ser.astype(dtype='category')
print(ser)
out:
0 yellow
1 red
2 write
3 black
4 red
5 yellow
6 red
7 yellow
dtype: category
Categories (4, object): ['black', 'red', 'write', 'yellow']
# 获取类别category的index
print(ser.cat.categories) # category: 种类,类别 , 这个排列顺序是根据 ASCII 码排序的
out:
Index(['black', 'red', 'write', 'yellow'], dtype='object')
# 获取类别编码
print(ser.cat.codes) # category 智能 选取 int 类型为 int8
out:
0 3
1 1
2 2
3 0
4 1
5 3
6 1
7 3
dtype: int8
六、Pandas里高性能的eval和query方法
参考资料:https://blog.csdn.net/jasonzhoujx/article/details/81709526
参考资料:https://blog.csdn.net/qq_45488242/article/details/107878588?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242