Python数据分析学习笔记04:Pandas基础

文章目录html

1、数据结构:Series和DataFramepython

一、Series(序列——一维序列结构)算法

二、DataFrame(数据帧——二维表结构)sql

2、数据导入和输出json

一、导入excel文件数组

二、导入csv文件数据结构

三、将数据帧导出成excel文件app

3、数据清洗函数

一、删除数据帧中没必要要的行或列工具

二、重命名列名

三、去掉重复的行

四、格式问题

(1)更改数据格式(类型)

(2)大小写转换

(3)数据间的空格

五、查找空值

六、使用apply函数对数据进行清洗

(1)应用系统自带函数

(2)应用自定义函数

七、添加行和添加列

(1)添加新行:Green   89     89    85

(2)在Alice以后插入新行:Brian    56   63   90

(3)添加新列:Average

4、数据统计

一、count()函数

二、describe()函数

三、方差函数var()

四、中位数函数median()

5、数据表合并

一、基于指定列进行链接

二、inner内链接

三、left链接

四、right链接

五、outer外链接

6、如何用SQL方式打开Pandas

一、安装pandasql工具包

二、查询案例演示

(1)查询姓名为Howard的记录

(2)查询语文成绩在80与90之间的记录

(3)将Howard的语文成绩改为99

(4)删除姓名为Howard的记录

7、总结

8、课后练习


在数据分析工做中,Pandas使用频率很高,一方面是由于Pandas提供的基础数据结构DataFrame与JSON契合度高,转换起来挺方便。另外一方面,对于不太复杂的平常数据清理工做,一般用几句Pandas代码就能够对数据进行规整。

Pandas是基于NumPy构建的含有更高级数据结构和分析能力的工具包。NumPy中数据结构是围绕ndarray展开的,Pandas的核心数据结构是Series(序列——一维序列结构)和DataFrame(数据帧——二维表结构)。基于这两种数据结构,Pandas能够对数据进行导入、清洗、处理、统计和输出。

1、数据结构:Series和DataFrame

一、Series(序列——一维序列结构)

(1)概念:Series是个定长的字典序列。存储时至关于两个ndarray,这是与字典结构最大的不一样,由于字典结构里,元素个数是不固定的。

(2)属性:index 与 value

         index默认是从0开始的整数序列,固然也能够本身指定索引。

Series看起来像一种特殊的字典结构,所以咱们也能够采用字典方式来建立Series。

Series元素的类型能够不一致,就像NumPy的数组,元素类型能够不一样。

from pandas import Series

x1 = Series([100, 200, 300, 400])

x1
Out[3]: 
0    100
1    200
2    300
3    400
dtype: int64

x2 = Series(data=[100, 200, 300, 400], index=['a', 'b', 'c', 'd'])

x2
Out[5]: 
a    100
b    200
c    300
d    400
dtype: int64

x1[2], x2['c']
Out[6]: (300, 300)

x3 = Series({'a': 100, 'b': 200, 'c': 300, 'd': 400})

x3
Out[8]: 
a    100
b    200
c    300
d    400
dtype: int64

x2 == x3
Out[9]: 
a    True
b    True
c    True
d    True
dtype: bool

x4 = Series([1, 'Mike', 'male', 20])

x4
Out[11]: 
0       1
1    Mike
2    male
3      20
dtype: object

import numpy as np

x5 = np.array([1, 'Mike', 'male', 20])

x5
Out[14]: array(['1', 'Mike', 'male', '20'], dtype='<U11')

x5[1]
Out[15]: 'Mike'

print(x5)
['1' 'Mike' 'male' '20']

print(x5)
['1' 'Mike' 'male' '20']

二、DataFrame(数据帧——二维表结构)

DataFrame包括行索引和列索引,能够将其当作是由相同索引的Series组成的字典类型。

行索引是默认的0、一、二、三、4,列索引是用户自定义的。固然行索引也能够自定义。

from pandas import DataFrame

data = {'Chinese': [89, 67, 89, 65, 84],
        'Math': [78, 90, 63, 75, 80],
        'English': [90, 67, 87, 60, 87]}

df1 = DataFrame(data)

df1
Out[4]: 
   Chinese  Math  English
0       89    78       90
1       67    90       67
2       89    63       87
3       65    75       60
4       84    80       87

df2 = DataFrame(data, index=['Mike', 'Alice', 'Frank', 'Brown', 'Smith'])

df2
Out[6]: 
       Chinese  Math  English
Mike        89    78       90
Alice       67    90       67
Frank       89    63       87
Brown       65    75       60
Smith       84    80       87

能够经过行索引取某一行的数据:

经过行索引与列索引获取某个元素值:

了解了Series与DataFrame这两个数据结构后,咱们就能够从数据处理的流程角度来看它们的使用方法。

2、数据导入和输出

一、导入excel文件

二、导入csv文件

三、将数据帧导出成excel文件

固然,还能够将数据帧导出成各类格式的文件,好比csv、html、json等等。

3、数据清洗

一、删除数据帧中没必要要的行或列

删除Brown所在行:

继续删掉Chinese那一列:

二、重命名列名

函数:rename(columns=new_names, inplace=True)

  • 参数inplace设置True,直接在原数据帧上修改列名;
  • 参数inplace设置为False,原数据帧列名不变,在返回的数据帧上修改列名。

将列名Math改成ShuXue,English改成YingYu:

能够看到,若是参数inplace设置为True,那么直接在原数据帧上修改列名。

若是参数inplace不设置,默认是False,那么原数据帧列名不变,返回的数据帧列名获得修改。

df2的列名仍是ShuXue和YingYu,只有返回的数据帧df3列名改为了Math和English。

三、去掉重复的行

数据采集中可能存在重复的行,使用drop_duplicates()就能自动去掉重复的行。

注意,调用这个去重方法,不改变原数据帧,只是在返回的数据帧里去掉重复的行。

四、格式问题

(1)更改数据格式(类型)

使用astype函数来规范数据格式,好比将数据帧df2的ShuXue字段值改为str类型:

将df2的YingYu字段类型改为float64:

此时,再查看数据帧df2的内容:

有点奇怪,YingYu字段的值仍是整型,没有变成浮点型。

import numpy as np

import pandas as pd

from pandas import DataFrame

data = {'Chinese': [89, 67, 89, 65, 84],
        'Math': [78, 90, 63, 75, 80],
        'English': [90, 67, 87, 60, 87]}

df1 = DataFrame(data)

df1
Out[6]: 
   Chinese  Math  English
0       89    78       90
1       67    90       67
2       89    63       87
3       65    75       60
4       84    80       87

df2 = DataFrame(data, index=['Mike', 'Alice', 'Frank', 'Brown', 'Smith'])

df2
Out[8]: 
       Chinese  Math  English
Mike        89    78       90
Alice       67    90       67
Frank       89    63       87
Brown       65    75       60
Smith       84    80       87

df2 = df2.drop(columns=['Chinese'])

df2
Out[10]: 
       Math  English
Mike     78       90
Alice    90       67
Frank    63       87
Brown    75       60
Smith    80       87

df2 = df2.drop(index='Brown')

df2
Out[12]: 
       Math  English
Mike     78       90
Alice    90       67
Frank    63       87
Smith    80       87

df2.rename(columns={'Math': 'ShuXue', 'English': 'YingYu'}, inplace=True)

df2
Out[14]: 
       ShuXue  YingYu
Mike       78      90
Alice      90      67
Frank      63      87
Smith      80      87

col1 = df2['ShuXue'].astype(np.string_)

col2 = df2['YingYu'].astype(np.float64)

DataFrame(col1)
Out[17]: 
      ShuXue
Mike   b'78'
Alice  b'90'
Frank  b'63'
Smith  b'80'

DataFrame(col2)
Out[18]: 
       YingYu
Mike     90.0
Alice    67.0
Frank    87.0
Smith    87.0

# 将col1与col2横向拼接

pd.concat([col1, col2], axis=1)
Out[20]: 
      ShuXue  YingYu
Mike   b'78'    90.0
Alice  b'90'    67.0
Frank  b'63'    87.0
Smith  b'80'    87.0

(2)大小写转换

有三个函数upper()、lower()、title()。

(3)数据间的空格

有时先将数据转换成str类型,是为了方便对数据进行操做,好比要删除数据间的空格,就可使用strip函数。

也能够用strip函数来删除特定的字符:

五、查找空值

数据源可能存在有些字段是NaN的状况,如何查找空值呢?能够利用pandas的isnull函数来查找。

若是想知道哪一列存在空值,能够利用df.isnull().any()函数:

六、使用apply函数对数据进行清洗

apply函数是Pandas中自由度很是高的函数,使用频率也十分高。

(1)应用系统自带函数

(2)应用自定义函数

定义一个提分20%的函数:

将这个提分函数应用到Chinese科目上:

定义一个函数,添加一个新字段Score,计算三科成绩的加权平均值:

七、添加行和添加列

(1)添加新行:Green   89     89    85

(2)在Alice以后插入新行:Brian    56   63   90

(3)添加新列:Average

4、数据统计

在数据清洗后,咱们就要对数据进行统计了。Pandas和NumPy同样,都有经常使用的统计函数,若是遇到空值NaN,会自动排除。

一、count()函数

二、describe()函数

该函数是个统计大礼包,对数据有个全面的了解。

三、方差函数var()

四、中位数函数median()

5、数据表合并

两个数据表DataFrame合并要使用merge()函数,有下列5种形式:

一、基于指定列进行链接

二、inner内链接

inner内链接是merge函数的默认状况,基于公共键进行链接,由于df1与df2的公共键是name,其实就是基于name的链接:

三、left链接

left链接是以第一个DataFrame为主,第二个DataFrame为辅的链接。

四、right链接

right链接是以第二个DataFrame为主,第一个DataFrame为辅的链接。

五、outer外链接

外链接至关于两个DataFrame求并集。

如何查询成绩在90分以上的记录?

如何查询成绩在80分与90分之间的记录?

6、如何用SQL方式打开Pandas

Pandas的DataFrame数据类型可让咱们像处理数据表同样进行操做,好比数据表的增删改查,均可以用Pandas工具来完成。不过也有不少人记不住这些Pandas命令,而但愿采用本身更加熟练的SQL语句来对数据表进行操做。

利用pandasql工具能够采用SQL语句操做数据表。pandasql主要的函数sqldf,接收两个参数:SQL查询语句和一组环境变量globals()或locals()。这样咱们就能够在Python里直接用SQL语句操做DataFrame了。

一、安装pandasql工具包

二、查询案例演示

(1)查询姓名为Howard的记录

(2)查询语文成绩在80与90之间的记录

在定义pysqldf时候采用了lamda函数,也就是匿名函数,对于sql语句进行处理。

不用pandasql,也能够直接利用pandas语句完成一样的查询任务:

(3)将Howard的语文成绩改为99

(4)删除姓名为Howard的记录

7、总结

和NumPy同样,Pandas有两个很是重要的数据结构:Series和DataFrame。

使用Pandas能够直接从csv或xslx等文件导入数据,以及最终输出到不一样类型的文件中,好比csv或excel文件。

重点学习了数据清洗的操做,以及Pandas提供的统计函数,尤为你们要记住的是统计大礼包函数describe()。

学习了如何利用merge函数将两个数据表合并,并学习了5种不一样的链接方式。

学习了利用pandasql工具在Pandas里采用sql语句对数据表进行操做。

Pandas包与NumPy库配合使用能够发挥巨大的威力,正是有了Pandas(潘大师)工具,Python作数据挖掘才有优点。


8、课后练习

利用下表建立DataFrame,进行数据清洗。同时新增一列“总和”计算每一个人三科成绩之和。

# 数据清洗

import pandas as pd
from pandas import DataFrame

df = pd.read_excel('e:/excelfiles/test2.xlsx')

print("原表:")
print(df)

# 1. 删除有NaN值的行
cols = []
nullcols = df.isnull().any()
for i in range(len(nullcols)):
    if nullcols[i] == True:
        cols.append(nullcols.index[i])        
nulltable = df.isnull()
for i in range(len(cols)):
    nullindex = nulltable[nulltable[cols[i]] == True].index[0]
    df = df.drop(index = nullindex)
print("删除有NaN的行:")
print(df)
    
# 2. 删除重复的行
df = df.drop_duplicates()
print("删除重复的行:")
print(df)

# 3. 添加总分字段,计算总分
df['总分'] = (df['语文'] + df['英语'] + df['数学']) / 3
print("添加总分字段:")
print(df)

运行结果:

原表:
   姓名  语文  英语   数学
0  张飞  66.0  65.0   NaN
1  关羽  95.0  85.0  98.0
2  赵云  95.0  92.0  96.0
3  黄忠  90.0  88.0  77.0
4  典韦  80.0  90.0  90.0
5  典韦  80.0  90.0  90.0
6  马超   NaN  89.0  74.0
7  曹洪  89.0  78.0  96.0
8  张郃  80.0  67.0  86.0
9  徐晃  85.0   NaN  56.0
删除有NaN的行:
   姓名  语文  英语   数学
1  关羽  95.0  85.0  98.0
2  赵云  95.0  92.0  96.0
3  黄忠  90.0  88.0  77.0
4  典韦  80.0  90.0  90.0
5  典韦  80.0  90.0  90.0
7  曹洪  89.0  78.0  96.0
8  张郃  80.0  67.0  86.0
删除重复的行:
   姓名  语文  英语   数学
1  关羽  95.0  85.0  98.0
2  赵云  95.0  92.0  96.0
3  黄忠  90.0  88.0  77.0
4  典韦  80.0  90.0  90.0
7  曹洪  89.0  78.0  96.0
8  张郃  80.0  67.0  86.0
添加总分字段:
   姓名  语文  英语   数学  总分
1  关羽  95.0  85.0  98.0  92.666667
2  赵云  95.0  92.0  96.0  94.333333
3  黄忠  90.0  88.0  77.0  85.000000
4  典韦  80.0  90.0  90.0  86.666667
7  曹洪  89.0  78.0  96.0  87.666667
8  张郃  80.0  67.0  86.0  77.666667

删除有NaN的行,算法能够简化一点:

删除有NaN的行,显得太简单粗暴,能够采用比较温和的均值填充法。

运行结果以下:

原表:
   姓名  语文  英语   数学
0  张飞  66.0  65.0   NaN
1  关羽  95.0  85.0  98.0
2  赵云  95.0  92.0  96.0
3  黄忠  90.0  88.0  77.0
4  典韦  80.0  90.0  90.0
5  典韦  80.0  90.0  90.0
6  马超   NaN  89.0  74.0
7  曹洪  89.0  78.0  96.0
8  张郃  80.0  67.0  86.0
9  徐晃  85.0   NaN  56.0
用列均值填充NaN值:
   姓名  语文  英语   数学
0  张飞  66.0  65.0  84.8
1  关羽  95.0  85.0  98.0
2  赵云  95.0  92.0  96.0
3  黄忠  90.0  88.0  77.0
4  典韦  80.0  90.0  90.0
5  典韦  80.0  90.0  90.0
6  马超  84.4  89.0  74.0
7  曹洪  89.0  78.0  96.0
8  张郃  80.0  67.0  86.0
9  徐晃  85.0  82.7  56.0
删除重复的行:
   姓名  语文  英语   数学
0  张飞  66.0  65.0  84.8
1  关羽  95.0  85.0  98.0
2  赵云  95.0  92.0  96.0
3  黄忠  90.0  88.0  77.0
4  典韦  80.0  90.0  90.0
6  马超  84.4  89.0  74.0
7  曹洪  89.0  78.0  96.0
8  张郃  80.0  67.0  86.0
9  徐晃  85.0  82.7  56.0
添加总分字段:
   姓名  语文  英语   数学  总分
0  张飞  66.0  65.0  84.8  71.933333
1  关羽  95.0  85.0  98.0  92.666667
2  赵云  95.0  92.0  96.0  94.333333
3  黄忠  90.0  88.0  77.0  85.000000
4  典韦  80.0  90.0  90.0  86.666667
6  马超  84.4  89.0  74.0  82.466667
7  曹洪  89.0  78.0  96.0  87.666667
8  张郃  80.0  67.0  86.0  77.666667
9  徐晃  85.0  82.7  56.0  74.566667

 

本文分享 CSDN - howard2005。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索