Pandas:高效数据处理利器全解析

pandas介绍

        pandas实质上就是表格,它的底层也是用c语言写的,所以处理数据也会快很多,他内部存储数据用字典类型存储的。

pandas库安装

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

直接在终端或者命令行安装就行了,这儿加上了清华源的镜像是为了下载的速度更快。

创建表格

DataFrame

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[100,200,300]},
                        index=['person1','person2','person3'])
print(df)
print(type(df))

 输出结果

上面我们就创建了一个表格的数据,我们还传入了idex索引,如果我们不传入索引就会默认0123,我们还查看了他的数据类型,如图我们可以看到,他的数据类型是DataFrame的。记得昨天我们学习的numpy的数据类型是ndarray的。

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[100,200,300]}
                        )
print(df)
print(type(df))

这个是没有明确指出索引index是什么的 

 Series

这个其实和那个差不读,只是这个是一维的,然后有索引,这么说起来是不是又和列表差不多了

import pandas as pd
a = ["Google", "Runoob", "Wiki"]

s = pd.Series(a, index = ["x", "y", "z"])
print(s)
print(type(s))
print(s.index)
print(s.values)

这样我们就创造了一个Series类型的,我们给的索引,其他就和上面没啥区别了。

pandas基本属性

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[100,200,300]},
                        index=['person1','person2','person3'])
print(df)
print(df.values)
print(df.index)
print(df.columns)

这里我们查看了这个表格的值,索引,还有列名。如下图我们可以很清晰的理解。

pandas方法介绍

下面我从增删改查几个方面来说pandas的方法

1 增加

增加一列

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300]},
                        index=['person1','person2','person3'])
print(df)
df['pay']=[10,20,30]
print(df)

输出  

增加一行

增加一行就比较麻烦了,因为对于某一行,不好定位,要用loc函数才行

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300]},
                        index=['person1','person2','person3'])
print(df)
df.loc['person4',['age','name','income']]=[12,'hhh',300]
print(df)

2 删除

删除某一列元素

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300]},
                        index=['person1','person2','person3'])
print(df)

df=df.drop(columns=['income'])
print(df)

输出

删除某一行元素

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300]},
                        index=['person1','person2','person3'])
print(df)

df=df.drop(index='person1')
print(df)

输出

这个我们可以看到,在我们删除某一行元素的时候,这个索引就变了,如果我们删除的多,那就乱套了,下面我来提供一种方式可以重置索引

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300]},
                        index=['person1','person2','person3'])
print(df)
df=df.drop(index='person1')
print(df)
df.index=['person'+str(i) for i in range(1,len(df)+1)]
print(df)

 

删除某一个具体元素

我们无法删除某一个元素,但是我们可以把那个元素替换为none这个就变相删除了,这个还有两种形式

删除这个具体元素存在的所有

import pandas as pd
df = pd.DataFrame({'age':[100,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,100]},
                        index=['person1','person2','person3'])
print(df)
df.replace(100, None, inplace=True)
print(df)

这个我们把数据中所有的这个值全删了

删除某一列中的某一个值的全部

例如

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,100]},
                        index=['person1','person2','person3'])
print(df)
df.loc[df['income'] == 100, 'income'] = None
print(df)

 输出这样我就把一列中为100的全部替换掉了

删除某一行某一列的具体值

import pandas as pd
df = pd.DataFrame({'age':[100,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,100]},
                        index=['person1','person2','person3'])
print(df)
df.loc['person2', 'income'] = None 
print(df)

这个我们具体定位到某一行的某一列,然后删除那个值

 3 选取内容

我们前面提到,构造这个表格的时候用的字典型数据,那么我们就可以用类似于字典的方法来选取内容,例如用字典的键来找值

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[100,200,300]},
                        index=['person1','person2','person3'])
print(df)
print(df.name)

这样我们就找到了name那一列的所有值

然后输出出来的又可以用index来找到。如要找tim,那么就可以df.name['person1']。

4 排序

我们可以根据某一列的值,然后用sort进行排序,从大到小或者从小到大都可以。

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300]},
                        index=['person1','person2','person3'])
print(df)
a=df.sort_values('income',ascending=False)
b=df.sort_values('income')
print(a)
print(b)

df.sort_values()中有两个参数,一个是要分类的列名,一个是控制排序方向,默认是TRUE,就是从小到大,如果设置成False就是从大到小了

我们会担心,会不会在排列这行的值的时候,其他数据不变就没有意义了,其实这些都是设计好的,在排列的时候其他跟着变。

5 值替换

import pandas as pd
df = pd.DataFrame({'age':[10,11,12],
                        'name':['tim','tom','rose'],
                        'income':[200,100,300],
                        'gender':['F','M','F']},
                        index=['person1','person2','person3'])
print(df)
df['gender']=df['gender'].replace(['M','F'],['male','female'])
print(df)

6 访问多个元素

import pandas as pd
df = pd.DataFrame({'age':[10,11,12,13],
                        'name':['tim','tom','rose','jack'],
                        'income':[200,100,100,400]},
                        index=['person1','person2','person3','person4'])
print(df,'\n')
print(df.name,'\n')
print(df['name'],'\n')
print(df['person1':'person3'],'\n')
print(df['person1':'person3']['name'],'\n')

 我打印了一个df.name又打印了一个df.['name'],实际上他们的结果是一模一样的

下面我直接用切片的方法来对索引进行了访问,但这里要注意我们不能只读取一个值,例如就访问一个person1,这样的话就会报错,如果要访问一个值,我们可以用一个函数loc,前面也用过。下面来介绍下。

7 loc函数

loc函数是一个定位函数,很厉害,可以定位的很精确,很全面,例如要读取一个索引的一行,其他方法不行,这个就行这样的话我们也就可以非常精确的读取到具体的一行的某一列的值了。

import pandas as pd
df = pd.DataFrame({'age':[10,11,12,13],
                        'name':['tim','tom','rose','jack'],
                        'income':[200,100,100,400]},
                        index=['person1','person2','person3','person4'])
print(df,'\n')
print(df.loc['person1','name'],'\n')
print(df.loc['person2':,'name'],'\n')
print(df.loc['person2':,'name':],'\n')

这样索引就对pandas太友好了啊,这样就可以进行许多操作了。

pandas读取数据

读取csv

读取excel和读取csv差不多的,就替换一下pd.read_excel就行了这里不多赘述了。

df = pd.read_csv('data.csv',encoding='gbk')
# 打印读取的 DataFrame
print(df)

 这样就直接读取数据了

 isnull()

我们注意到有一个空值,而且还没有报错,如果数据量非常大我们该怎么判断是否有空值呢。

import pandas as pd

# 读取 data.xlsx 文件
df = pd.read_csv('data.csv',encoding='gbk')
# 打印读取的 DataFrame
print(df)
a=pd.isnull(df)
print(a)

输出 

我们可以看到输出的都是True和False,那我们该如何看呢。

 我们来打开调试

我们可以找到这里有关于值大小的数据,可以很清楚看到max有True,如果出现这个就说明有空值的。

 fillna

这个可以在发现空值时对控制进行填充

import pandas as pd

# 读取 data.xlsx 文件
df = pd.read_csv('data.csv',encoding='gbk')
df1 = df.fillna('1')
print(df1)

填充完成 

dropna 

这个可以把有空值的那一行删除

import pandas as pd

# 读取 data.xlsx 文件
df = pd.read_csv('data.csv',encoding='gbk')
# 删除缺失值【删除整行数据】
df2 = df.dropna()#
print(df2)

 删除完成

duplicated

 这个函数可以判断数据内容是否重复,这个函数的原理就是对第一个出现的赋值false,再出现重复的就是True,那么就是重复的了。

import pandas as pd

# 读取CSV文件
df = pd.read_csv(r"data1.csv", encoding='gbk')
print(df)
# # """找出重复值的位置【逻辑判断】"""
result1 = df.duplicated()  # 全局重复行判断
print(result1)
"""根据列名来判断重复"""
# 根据单个列判断重复
result2 = df.duplicated('income')
print(result2)
# 根据多列组合判断重复
result3 = df.duplicated(['gender', 'name'])
print(result3)

输出结果也是True和False

我们可以根据这个值进行数据提取

import pandas as pd

# 读取CSV文件
df = pd.read_csv(r"data1.csv", encoding='gbk')
print(df)
result2 = df.duplicated('name')
print(result2)
duplicate_rows = df[result2]
print(duplicate_rows)

提取结果

这个其实就是把值是False的那个值给提取出来了。

删除重复行

这个可以指定要删除的重复行的那一列的名称,如果不填就默认是全部

import pandas as pd

# 读取CSV文件
df = pd.read_csv(r"data1.csv", encoding='gbk')
print(df)
new_df2 = df.drop_duplicates(['name'])
print(new_df2)

删除结果 

找条件内容

import pandas as pd
#
# 读取CSV文件
df = pd.read_csv(r"data1.csv", encoding='gbk')
print(df)
#取出年龄小于28,收入小于8000的人,这里&还可以变为|代表或的意思
df_1 = df[(df['age']<28)&(df['income']<8000)]
print(df_1)

输出

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值