基础知识_Pandas数据分析操作(二)

目录

一、读取MySqL表格数据【Python 读取MySQL】

二、数据处理★

  2.1、表格拼接 concat

  2.2、去重 drop_duplicates

  2.3、使用函数或者映射进行数据转换 map

  2.4、异常值处理 replace【异常值不是NaN,是基于经验判断不可能出现的数据】

   2.5、空值NaN处理★

    2.5.1、检查缺失值(isnull和notnull)

    2.5.2、删除全为空的列 dropna()

    2.5.3、删除有空值的行 dropna()

    2.5.4、填充空值[可以先用replace替换为NaN然后使用fillna]

    2.5.5、去除整一行全部都是0的数据(利用bool索引)

  2.6、数据标准化★

    2.6.1、离差标准化

    2.6.2、标准差标准化【相比较为常用,无量纲化】

  2.7、哑变量处理(独热编码)★ pd.get_dummies

  2.8、批量操作★ apply()  agg()

三、分组聚合统计 groupby()

四、输出MySQL数据表 .to_sql()

五、Pandas里面有针对三种特定的数据类型的独有属性和方法

六、Pandas里高性能的eval和query方法


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值