Pandas统计分析(三)

数据的增加、修改与删除

原始数据

scss 复制代码
import pandas as pd

data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']

df = pd.DataFrame(data=data,index=index,columns=columns)
print(df)

增加数据

DataFrame对象增加主要包括列数据增加和行数据增加。

按列增加数据

按列增加数据主要用三种方式进行实现:

  1. 直接为DataFrame进行赋值
  2. 使用loc属性在DataFrame对象的最后增加一列
  3. 在指定位置插入一列 insert进行实现
scss 复制代码
import pandas as pd

data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']
pd.set_option('display.unicode.east_asian_width',True)
df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)

#增加一列物理成绩
df['物理']=[88,99,100,110]
print(df)

# 使用loc属性进行增加一列化学成绩
df.loc[:,'化学']=[100,110,120,124.5]  #注意:小数点会保持一致,所以相当于新增的是[100.0,110.0,120.0,124.5]
print(df)

# 在指定位置插入一列生物成绩
df.insert(2,'生物',[121,131,141,145])  #注意:是在列索引为2的位置新增而不是替换
print(df)

按行增加数据

按行增加数据主要用两种方式进行实现:

1、增加单行数据 主要用loc属性进行实现

2、增加多行数据

ini 复制代码
import pandas as pd
# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']

df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)

# 增加单行
df.loc['阿飞']=[100,120,130]
print(df)

# 增加多行
df_add=pd.DataFrame(
    {
        '语文':[100,123,108],
        '数学':[101,113,103],
        '英语':[102,114,119]
    },index=['阿星','阿薇','阿慧']
)
new_df=pd.concat([df_add,df])
print(new_df)

修改数据

修改数据包括行、列标题与数据的修改。

修改列标题

修改列标题主要用两种方式进行实现:

1、修改列标题主要用到DataFrame对象的cloumns属性,直接赋值即可。

2、rename()方法进行列标题的修改。

ini 复制代码
import pandas as pd
# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']

df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)

# 修改单个  需要将所有的标题都写上,这样比较繁琐
df.columns=['语文','数学一','英语']
print(df)

# 用字典指定进行修改即可  指定inplace为True修改的时原df对象 不指定则返回修改后的新df
df.rename(columns={'语文':'语文一'},inplace=True)
print(df)

# 修改多个值
df.rename(columns={'语文':'语文一','数学':'数学一'},inplace=True)
print(df)

修改行标题

修改行标题主要用两种方式进行实现:

1、修改行标题主要用到DataFrame对象的index属性,直接赋值即可。

2、rename()方法进行列标题的修改。

ini 复制代码
import pandas as pd
# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']

df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)

df.index=[1,2,3,4]
print(df)

# 用字典指定进行修改即可  指定inplace为True修改的时原df对象 不指定则返回修改后的新df
df.rename(index={'阿岳':'Peric'},inplace=True)
print(df)

# 修改多个值
df.rename(index={'阿岳':'Peric','阿乔':'Parry','阿蓝':'Anna'},inplace=True)
print(df)

修改数据

修改数据主要用到DataFrame对象中的loc属性和iloc属性。

scss 复制代码
import pandas as pd
# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']

df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)

# 修改整行数据
df.loc['阿岳']=[120,134,145]
print(df)

# 修改整列数据
df.loc[:,'语文']=[111,99,102,111]
print(df)

# 修改某一数据
df.loc['阿岳','英语']=150
print(df)

# 使用iloc 属性修改数据
df.iloc[0,0] = 111
print(df)
df.iloc[:,0] = [111,112,113,114]
print(df)
df.iloc[0,:] = [123,124,125]
print(df)

删除数据

删除数据主要用的是DataFrame对象中的drop()方法。 语法如下:

ini 复制代码
drop(labels, axis=0, level=None, inplace=False, errors='raise')

常用参数说明:

labels: 表示行标签或者列标签

axis:指定按照行进行删除,还是按照列进行删除,如果设置为0,那么则删除行,如果为1,则删除列。0行1列

index:index是按照行删除时传入的参数,需要传入的是一个列表,包含待删除行的索引编号。

inplace:可选参数,对原数组做出修改并返回一个新数组。默认值为false,如果值为true,那么原数组直接就被替换。

columns:columns是按照列删除时的参数,同样传入的是一个列表,包含需要删除列的名称。

ini 复制代码
import pandas as pd
# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,123,132],[98,88,97],[101,102,103],[110,121,109]]
index = ['阿岳','阿乔','阿萧','阿蓝']
columns = ['语文','数学','英语']

df = pd.DataFrame(data=data,index=index,columns=columns)
# print(df)

df.drop(labels='数学',axis=1,inplace=True)  # 删除列标签为数学的列  #df.drop(columns=['数学'],inplace=True)
print(df)

df.drop(columns=['数学','语文'],inplace=True)  # 删除column为数学和语文的列
print(df)

df.drop(['阿岳'],axis=0,inplace=True)  # 删除某行 #df.drop(labels='阿岳',axis=0,inplace=True)
print(df)

df.drop(index='阿乔',axis=0,inplace=True)  # 删除index为阿乔的某行
print(df)

删除特定条件的行

删除特点条件的行,首先找到满足该条件的行索引,然后再使用drop()方法将其删除。

ini 复制代码
df.drop(labels='阿萧',axis=0,inplace=True) # 删除行标签为阿萧的行
print(df)

数据清洗

缺失值查找与处理

首先要找到缺失值,主要使用DataFrame对象的info()方法

python 复制代码
import pandas as pd

# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('TB2018.xls')

# print(df)

# print(df.info())  #显示概括数据
# 判断数据是否存在缺失值 还可以使用isnull()和notnull()方法
"""
isnull():
    缺失值返回True 非缺失值返回False
notnull():
    缺失值返回False 非缺失值返回True
"""
print(df.isnull)
print(df.notnull)

缺失值删除处理

通过前面的判断得知数据缺失情况,下面将缺失值删除,主要使用dropna()方法,该方法用于删除含有缺失值的行,主要代码如下:

scss 复制代码
import pandas as pd

# 解决数据输出时列名不对齐的问题
# pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('TB2018.xls')

print(df)

# print(df.info())

new_df = df.dropna()
print(new_df)

缺失值填充处理

对于缺失数据,如果比例高于30%可以选择放弃这个指标,做删除处理,低于30%的尽量不要删除,而是选择将这部分数据进行填充,一般以0、众数、均值进行填充。DataFrame对象中的fillna()函数可以实现填充缺失数据,pad/ffill表示用前一个非缺失值去填充该缺失值,backffill/bfill表示用下一个非缺失值填充该缺失值。

scss 复制代码
import pandas as pd

# 解决数据输出时列名不对齐的问题
# pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('TB2018.xls')

print(df)

# print(df.info())

df['宝贝总数量'] = df['宝贝总数量'].fillna(0)
#df['宝贝总数量'] = df['宝贝总数量'].ffill()  前一个非缺失值填充
#df['宝贝总数量'] = df['宝贝总数量'].bfill()  后一个非缺失值填充


print(df)

重复值处理

对于数据中存在的重复数据,包括重复的行或者几行中某一列的值重复一般做删除处理,主要使用dataFrame对象的drop_duplicates()方法。

ini 复制代码
df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)

参数说明如下:

  • subset:表示要进去重的列名,默认为 None。
  • keep:有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。
  • inplace:布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。
bash 复制代码
import pandas as pd

# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('1月.xlsx')
print(df)

#  判读每一行数据是否相同
print(df.duplicated())  #不同返回False

# 去除全部的重复数据
df.drop_duplicates()
print(df)

# 去除指定列的重复数据
new_df= df.drop_duplicates(['宝贝标题'])
print(new_df)

# 保留重复行中的最后一行
df2 = df.drop_duplicates(['宝贝标题'],keep='last')
print(df2)

# 直接删除,保留一个副本
df.drop_duplicates(['收货人姓名'],inplace=True)  #默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。
print(df)

索引的作用

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。pandas索引的作用如下:

1、更方便的查询数据

2、使用索引可以提升查询性能 如果索引是唯一的,pandas会使用哈希表优化,查找数据的时间复杂度为O(i)。 如果索引不是唯一的,但是有序,pandas会根据二分查找法,查找数据的时间复杂度为O(logN)。 如果索引是完全随机的,那么每次查询都要扫描数据表,查找数据的时间复杂度为O(N)。

3、自动的数据对齐功能。

4、强大的数据结构: 基于分类数的索引,提升性能。 多维索引,用于groupby多维聚合结果等。 时间类型索引,强大的日期和时间的方法支持。

scss 复制代码
import pandas as pd

s1 = pd.Series([10,20,30],index=list('abc'))
print(s1)

s2 =pd.Series([2,3,4],index=list('bcd'))
print(s2)

print(s1+s2)

重新设置索引

pandas有一个很重要的方法是reindex(),它的作用是创建一盒适应新索引的新对象。语法如下:

sql 复制代码
DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

参数如下:

labels : 新的标签/索引,以符合'axis'所指定的axis。

index, columns : 新的标签/索引要符合。最好是一个索引对象,以避免重复的数据

axis : axis的目标。可以是axis的名称('索引'、'列')或数字(0、1)。

method: {None, 'backfill'/'bfill', 'pad'/'ffill', 'nearest'}, optional

copy : 返回一个新的对象,即使通过的索引是相同的。

level : 跨层广播,与通过的MultiIndex层的索引值相匹配。

fill_value : 在计算前用这个值填充现有的缺失(NaN)值,以及成功的DataFrame对齐所需的任何新元素。如果两个对应的DataFrame位置的数据都缺失,结果将是缺失。

limit : 向前或向后填充的最大连续元素数

tolerance : 不精确匹配的原始和新标签之间的最大距离。匹配位置的索引值最能满足方程式abs(index[indexer] -- target) <= tolerance。

返回 : reindexed : DataFrame

对Series对象重新设置索引

scss 复制代码
import pandas as pd

s1 = pd.Series([88, 77, 66], index=[1, 2, 3])
print(s1)
print(s1.reindex([1,2,3,4,5]))
print(s1.reindex([1,2,3,4,5],fill_value=0))

对dataframe对象重新设置索引

css 复制代码
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130]]
index=['mr001','mr003','mr005']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=index,columns=columns)
print(df)

#通过reindex()方法重新设置行索引、列索引和行列索引
print(df.reindex(['mr001','mr002','mr003','mr004','mr005'])) #①
print(df.reindex(columns=['语文','物理','数学','英语']))
print(df.reindex(index=['mr001','mr002','mr003','mr004','mr005'],columns=['语文','物理','数学','英语']))

①的输出:

注意:重新设置行索引/列索引之后,由于没有数据,所以会显示空格。

设置某列为行索引

设置某列为行索引主要使用set_index()方法

ini 复制代码
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('1月.xlsx')
df1=df.head()
print(df1)

#设置"买家会员名"为行索引
df=df.set_index(['买家会员名'])
df2=df.head()
print(df2)

数据清洗后重新设置连续的行索引

在对Dataframe对象进行数据清洗后,例如去掉含有NaN的行之后,发现行索引还是原来的行索引。

如果要重新设置索引可以使用reset_index()方法,在删除确实数据后重新设置索引,主要代码如下:

ini 复制代码
import pandas as pd

df=pd.read_excel('TB2018.xls')
print(df)
df1=df.dropna()
print(df1) # 删除含有空格的行,剩下025689

df2=df.dropna().reset_index(drop=True)
print(df2) # 对剩下的行重新赋予行索引:012345
相关推荐
databook13 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar15 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805115 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_15 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机21 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i1 天前
drf初步梳理
python·django
每日AI新事件1 天前
python的异步函数
python