likes
comments
collection
share

Pandas统计分析(数据处理、索引值处理)

作者站长头像
站长
· 阅读数 3

数据的增加、修改与删除

原始数据

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进行实现
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、增加多行数据

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()方法进行列标题的修改。

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()方法进行列标题的修改。

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属性。

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()方法。 语法如下:

drop(labels, axis=0, level=None, inplace=False, errors='raise')

常用参数说明:

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

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

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

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

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

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()方法将其删除。

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

数据清洗

缺失值查找与处理

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

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()方法,该方法用于删除含有缺失值的行,主要代码如下:

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表示用下一个非缺失值填充该缺失值。

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()方法。

df.drop_duplicates(subset=['A','B','C'],keep='first',inplace=True)

参数说明如下:

  • subset:表示要进去重的列名,默认为 None。
  • keep:有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。
  • inplace:布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项。
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多维聚合结果等。 时间类型索引,强大的日期和时间的方法支持。

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统计分析(数据处理、索引值处理)

重新设置索引

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

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对象重新设置索引

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))

Pandas统计分析(数据处理、索引值处理)

对dataframe对象重新设置索引

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=['语文','物理','数学','英语']))

①的输出:

Pandas统计分析(数据处理、索引值处理)

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

设置某列为行索引

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

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)

Pandas统计分析(数据处理、索引值处理)

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

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

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

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