python数据分析:数据探索和数据预处理

1. 数据探索

1.1 常用的统计量分析

源数据

年份,人均GDP(元),产量(万千升),人均消费指数
2000,7857.7,2231.3,100.4
2001,8521.7,2288.9,100.7
2002,9339.2,2402.7,99.2
2003,10542.0,2540.5,101.2
2004,12233.5,2958.9,103.9
2005,1569.5,256.9,80.9
#读取数据
import pandas as pd

df = pd.read_csv("data.csv", index_col="年份")
#获取数据个数
print(len(df))
print(df.index.size)

#均值
mean = df["人均GDP(元)"].mean()
print("%.2f"%mean)

#中位数:排序后在中间位置(或者中间两位的平均值)
print(df["人均GDP(元)"].median())

#众数:可能有多个众数
from pandas import Series
data = Series([750,800,950,750,800,801,800,750])
print(data.mode()[0])

#最大值
print(df["人均GDP(元)"].max())
#最小值
print(df["人均GDP(元)"].min())

#所有数据的最大值

print(df.max())
"""
人均GDP(元)    12233.5
产量(万千升)      2958.9
人均消费指数        103.9
dtype: float64
"""

#极差=最大值-最小值
print(df["人均GDP(元)"].max()-df["人均GDP(元)"].min())

#标准差:std--描述波动性
std = df["人均GDP(元)"].std()
print("%.2f"%std)

# 方差:var
var = df["人均GDP(元)"].var()
print("%.2f"%var)

#四分位数
# 先按从小到大方法排序,然后使用下列公式:
"""
p=0.25 0.5 0.75 
方法1 pos = (n+1)*p
方法2 pos = 1+(n-1)*p

例如:数据----6,7,15,36,39,40,41,42,43,47,49

第一四分位数(下四分位数)
(11+1)/4 =3,说明它在第三个位置,所以是15,即Q1=15。

中位数
(11+1)/4*2=6,所以是40。

第三四分位数(上四分位数)
(11+!)/4*3=9, 所以是43。
至此,Q1=15,Q2=40,Q3=43。

下面根据公式(n-1)法计算
1+(11-1)x 0.25 =3.5,则Q1=15x0.5+36x0.5=25.5
1+(11-1)x 0.5 =6,则Q2=15x0.5+36x0.5=40
1+(11-1)x 0.75 =8.5,则Q3=42x0.5+43x0.5=42.5

"""

#代码实现
desc = df.describe()
"""
          人均GDP(元)      产量(万千升)      人均消费指数
count      6.000000     6.000000    6.000000
mean    8343.933333  2113.200000   97.716667
std     3663.652617   945.755975    8.384132
min     1569.500000   256.900000   80.900000
25%     8023.700000  2245.700000   99.500000
50%     8930.450000  2345.800000  100.550000
75%    10241.300000  2506.050000  101.075000
max    12233.500000  2958.900000  103.900000
"""
#获取某个指标
print(desc["人均GDP(元)"]["25%"])       #8023.7
print(desc.loc["25%"][0])             #8023.7
print(desc.iloc[4]["人均GDP(元)"])      #8023.7
#极差
res = desc["人均GDP(元)"]["max"] - desc["人均GDP(元)"]["min"]
print(res)

#计算所有指标极差
res = desc.loc["max"] - desc.loc["min"]
"""
人均GDP(元)    10664.0
产量(万千升)      2702.0
人均消费指数         23.0
dtype: float64
"""
#将极差添加到数据框
desc.loc["range"] = res
print(desc)
"""
           人均GDP(元)      产量(万千升)      人均消费指数
count      6.000000     6.000000    6.000000
mean    8343.933333  2113.200000   97.716667
std     3663.652617   945.755975    8.384132
min     1569.500000   256.900000   80.900000
25%     8023.700000  2245.700000   99.500000
50%     8930.450000  2345.800000  100.550000
75%    10241.300000  2506.050000  101.075000
max    12233.500000  2958.900000  103.900000
range  10664.000000  2702.000000   23.000000
"""
#添加方差
# var = df.var()
# desc.loc["var"] = var
# print(desc)

1.2 相关性分析

源数据

分行编号,不良贷款,各项贷款余额,本年累计应收贷款,贷款项目个数,本年固定资产投资额
1,0.9,67.3,6.8,5,51.9
2,1.1,111.3,19.8,16,90.9
3,4.8,173.0,7.7,17,73.7
4,3.2,80.8,7.2,10,14.5
5,7.8,199.7,16.5,19,63.2

1.散点图

#读取数据
import pandas as pd
df = pd.read_csv("data2.csv", index_col="分行编号")
print(df)

#散点图
x = df["各项贷款余额"]
y = df["不良贷款"]

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.scatter(x,y, alpha=0.5)      #alpha:数据标记的透明度

#设置
ax.set_title("各项贷款余额&不良贷款")
ax.set_xlabel("各项贷款余额")
ax.set_ylabel("不良贷款")
#设置字体
from pylab import mpl
mpl.rcParams["font.sans-serif"]= ["FangSong"]

在这里插入图片描述
2.散点矩阵
将指标进行两两相关性分析:对角线是每个指标的直方图

from pandas.plotting import scatter_matrix

scatter_matrix(df, figsize=(15,15), marker="o", alpha=0.5)     #figsize:画布尺寸,marker:标记点的样式
plt.show()

在这里插入图片描述

3.相关系数

c = df.corr()
"""
               不良贷款    各项贷款余额  本年累计应收贷款    贷款项目个数  本年固定资产投资额
不良贷款       1.000000  0.876056  0.144891  0.686848  -0.022967
各项贷款余额     0.876056  1.000000  0.381666  0.892914   0.447281
本年累计应收贷款   0.144891  0.381666  1.000000  0.639148   0.650556
贷款项目个数     0.686848  0.892914  0.639148  1.000000   0.560098
本年固定资产投资额 -0.022967  0.447281  0.650556  0.560098   1.000000
"""
#获取某列相关系数
print(c["不良贷款"])
"""
不良贷款         1.000000
各项贷款余额       0.876056
本年累计应收贷款     0.144891
贷款项目个数       0.686848
本年固定资产投资额   -0.022967
Name: 不良贷款, dtype: float64
"""
#计算两个指标的相关系数
res = df["不良贷款"].corr(df["各项贷款余额"])
print("%.2f"%res)  #0.88
print(df["不良贷款"].corr(df["不良贷款"]))  #1.0

1.3 数据透视表pivot_table

源数据

学习中心,招生批次,院校名称,层次,专业,数据来源,招生途径,市场途径,身份证号码,费用科目,缴费方式,已缴纳学费
天津实训中心,20201109,天津大学,本科,机械,实训中心,大客户,大客户,202011091234,学费,支付宝,2500
北京实训中心,20201110,北京大学,硕士,软件,实训中心,大客户,大客户,202011091235,学费,微信,3800
天津实训中心,20201109,天津大学,本科,机械,实训中心,老带新,老带新,202011091236,学费,微信,4000
北京实训中心,20201110,北京大学,硕士,接卸,实训中心,大客户,大客户,202011091237,学费,支付宝,2500
天津实训中心,20201114,天津大学,本科,软件,实训中心,老带新,老带新,202011091238,学费,支付宝,3900
天津实训中心,20201114,南开大学,博士,管理,实训中心,大客户,大客户,202011091239,学费,支付宝,2500
天津实训中心,20201114,天津大学,硕士,软件,实训中心,老带新,老带新,202011091240,学费,pos直汇,5000

code


#读取数据
import pandas as pd
df = pd.read_csv("data2.csv")
print(df)
print(df.describe(include="all").T)       #include="all"给出所有数据的信息

#数据透视表
import numpy as np
#求各学习中心已缴纳学费的总和
s1 = df.pivot_table(index=["学习中心"],values=["已缴纳学费"],aggfunc=np.sum)
print(s1)
"""
        已缴纳学费
学习中心         
北京实训中心   6300
天津实训中心  17900s
"""
#求各学习中心已缴纳学费的均值
mean1 = df.pivot_table(index=["学习中心"],values=["已缴纳学费"],aggfunc=np.mean)
print(mean1)
"""
        已缴纳学费
学习中心         
北京实训中心   3150
天津实训中心   3580
"""

#求各学习中心的报名人数
count = df.pivot_table(index=["学习中心"],values=["身份证号码"],aggfunc=np.count_nonzero)
print(count)
"""
        身份证号码
学习中心         
北京实训中心      2
天津实训中心      5
"""
#多个指标:求各学习中心已缴纳学费的总和和报名人数
res = df.pivot_table(index=["学习中心"],values=["已缴纳学费", "身份证号码"],aggfunc={"已缴纳学费":np.sum, "身份证号码":np.count_nonzero})
print(res)
"""
        已缴纳学费  身份证号码
学习中心                
北京实训中心   6300      2
天津实训中心  17900      5
"""

2. 数据预处理

2.1 数据集合并

import pandas as pd

df1 = pd.DataFrame({"key":["a", "b", "c", "d"], "data1":range(4)})
print(df1)

"""
  key  data1
0   a      0
1   b      1
2   c      2
3   d      3
"""

df2 = pd.DataFrame({"key":["a", "b", "e", "f"], "data2":range(1, 5)})
print(df2)
"""
  key  data2
0   a      1
1   b      2
2   e      3
3   f      4
"""
# 合并(相同列),两个表内连接,取交集
data = pd.merge(df1, df2)
print(data)
"""
  key  data1  data2
0   a      0      1
1   b      1      2
"""
#左连接:以左边为准
data = pd.merge(df1, df2, how="left")
print(data)
"""
  key  data1  data2
0   a      0    1.0
1   b      1    2.0
2   c      2    NaN
3   d      3    NaN
"""

#右连接
data = pd.merge(df1, df2, how="right")
print(data)

#concat:axis=0纵向连接
data = pd.concat([df1,df2],axis=0, sort=False)
print(data)
"""
  key  data1  data2
0   a    0.0    NaN
1   b    1.0    NaN
2   c    2.0    NaN
3   d    3.0    NaN
0   a    NaN    1.0
1   b    NaN    2.0
2   e    NaN    3.0
3   f    NaN    4.0
"""

#concat:axis=1横向连接
data = pd.concat([df1,df2],axis=1, sort=False)
print(data)
"""
  key  data1 key  data2
0   a      0   a      1
1   b      1   b      2
2   c      2   e      3
3   d      3   f      4
"""

2.2 常用函数

源数据:data2.csv

学习中心,招生批次,院校名称,层次,专业,数据来源,招生途径,市场途径,身份证号码,费用科目,缴费方式,已缴纳学费
天津实训中心,20201109,天津大学,本科,机械,实训中心,大客户,大客户,202011091234,学费,支付宝,2500
北京实训中心,20201110,北京大学,硕士,软件,实训中心,大客户,大客户,202011091235,学费,微信,3800
天津实训中心,20201109,天津大学,本科,机械,实训中心,老带新,老带新,202011091236,学费,微信,4000
北京实训中心,20201110,北京大学,硕士,接卸,实训中心,大客户,大客户,202011091237,学费,支付宝,2500
天津实训中心,20201114,天津大学,本科,软件,实训中心,老带新,老带新,202011091238,学费,支付宝,3900
天津实训中心,20201114,南开大学,博士,管理,实训中心,大客户,大客户,202011091239,学费,支付宝,2500
天津实训中心,20201114,天津大学,硕士,软件,实训中心,老带新,老带新,202011091240,学费,pos直汇,5000


源数据:data.csv

年份,人均GDP(元),产量(万千升),人均消费指数
2000,7857.7,2231.3,100.4
2001,8521.7,2288.9,100.7
2002,9339.2,2402.7,99.2
2003,10542.0,2540.5,101.2
2004,12233.5,2958.9,103.9
2005,1569.5,256.9,80.9

code

import pandas as pd

df = pd.read_csv("data2.csv")
print(df)

#分组统计:groupby
# 与函数连用才有意义
data = df.groupby("学习中心")["已缴纳学费"].sum()
print(data)
"""
学习中心
北京实训中心     6300
天津实训中心    17900
Name: 已缴纳学费, dtype: int64
"""

#统计各学习中心的报名数
data = df.groupby("学习中心")["身份证号码"].count()
print(data)
"""
学习中心
北京实训中心    2
天津实训中心    5
Name: 身份证号码, dtype: int64
"""

#数据聚合运算:apply
# 可以很方便的对分组进行现有的运算和自定义运算
df = pd.read_csv("data.csv", index_col="年份")
print(df)

#按照列求最大值
data = df.apply(max,axis=0)
print(data)
"""
人均GDP(元)    12233.5
产量(万千升)      2958.9
人均消费指数        103.9
dtype: float64
"""
#按照行求最大值
data = df.apply(max,axis=1)
print(data.head(4))
"""
年份
2000     7857.7
2001     8521.7
2002     9339.2
2003    10542.0
dtype: float64
"""

#stack:将数据的列“旋转”为行
data = df.stack()
print(data.head(6))
"""
年份            
2000  人均GDP(元)    7857.7
      产量(万千升)     2231.3
      人均消费指数       100.4
2001  人均GDP(元)    8521.7
      产量(万千升)     2288.9
      人均消费指数       100.7
dtype: float64
"""
#unstack(stack的逆运算):将数据的行“旋转”为列
data = df.stack().unstack()
print(data.head(2))
"""
      人均GDP(元)  产量(万千升)  人均消费指数
年份                             
2000    7857.7   2231.3   100.4
2001    8521.7   2288.9   100.7
"""

2.3 缺失值的处理:NaN(不是数字)

1.Series

from pandas import Series
import numpy as np

stringSer = Series(["a","b",np.nan,"c","d"])
print(stringSer)
"""
0      a
1      b
2    NaN
3      c
4      d
dtype: object
"""

#isnull:判断为空
print(stringSer.isnull())
"""
0    False
1    False
2     True
3    False
4    False
dtype: bool
"""

#notnull:判断不为空
print(stringSer.notnull())
"""
0     True
1     True
2    False
3     True
4     True
dtype: bool
"""
#少选非缺失值
data = stringSer[stringSer.notna()]
print(data)
"""
0    a
1    b
3    c
4    d
dtype: object
"""
#删除缺失值:dropna
data = stringSer.dropna()
print(data)


2.DataFrame

from pandas import DataFrame
import numpy as np

df = DataFrame([[1.4, np.nan],
                [7.2, -4.5],
                [np.nan, np.nan],
                [0.75, -1.3]], index=list("ABCD"), columns=["one", "two"])
print(df)
"""
    one  two
A  1.40  NaN
B  7.20 -4.5
C   NaN  NaN
D  0.75 -1.3
"""

#dropna
data = df.dropna()      #去掉有缺失值的整行
print(data)
"""
    one  two
B  7.20 -4.5
D  0.75 -1.3
"""
data = df.dropna(how="all")      #z只有当整行都缺失时才会删除
print(data)
"""
    one  two
A  1.40  NaN
B  7.20 -4.5
D  0.75 -1.3
"""

#填充缺失值:fillna
data = df.fillna(0)     #把缺失值用0填充
print(data)
"""
    one  two
A  1.40  0.0
B  7.20 -4.5
C  0.00  0.0
D  0.75 -1.3
"""

#不同列的缺失值用不同的值填充
data = df.fillna({"one":0,"two":1})
print(data)
"""
A  1.40  1.0
B  7.20 -4.5
C  0.00  1.0
D  0.75 -1.3
"""

#以均值填充缺失值
mean = df.mean()
print(mean)
"""
one    3.116667
two   -2.900000
dtype: float64
"""
data = df.fillna(mean)
print(data)
"""
        one  two
A  1.400000 -2.9
B  7.200000 -4.5
C  3.116667 -2.9
D  0.750000 -1.3
"""


2.4 异常值及数据标准化

源数据

sno,name,age
20201109,frankshi1,5
20201110,frankshi2,6
20201111,frankshi3,-1
20201112,frankshi4,0
20201113,frankshi5,300
20201114,frankshi6,5

1.异常值处理

import pandas as pd

df = pd.read_csv("data.csv")
print(df)

desc = df.describe()
print(desc)

#筛选异常值
data = df.loc[:,"age"][df.age<=0]
print(data)
"""
2   -1
3    0
Name: age, dtype: int64
"""
#定位异常值
print(df.loc[2,"age"])  #-1

#将异常值填充为缺失值
import numpy as np
df.loc[2,"age"] = np.nan
print(df)
"""
        sno       name    age
0  20201109  frankshi1    5.0
1  20201110  frankshi2    6.0
2  20201111  frankshi3    NaN
3  20201112  frankshi4    0.0
4  20201113  frankshi5  300.0
5  20201114  frankshi6    5.0
"""

2.数据标准化
源数据

78,89,1,56
200,586,99,50
8,300,-989,96
66,1052,45,6
import pandas as pd

data = pd.read_csv("data.csv", header=None)
print(data)

#标准分数=(原始数据-均值)/标准差

#均值
mean = data.mean()
print(mean)
"""
0     88.00
1    506.75
2   -211.00
3     52.00
dtype: float64
"""

#标准差
std = data.std()
print(std)
"""
0     80.680440
1    416.668833
2    520.212777
3     36.842005
dtype: float64
"""

#标准分数
res = (data-mean)/std
print(res)
"""
          0         1         2         3
0 -0.123946 -1.002595  0.407526  0.108572
1  1.388193  0.190199  0.595910 -0.054286
2 -0.991566 -0.496197 -1.495542  1.194289
3 -0.272681  1.308593  0.492106 -1.248575
"""

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值