数据的增加、修改与删除
原始数据
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对象增加主要包括列数据增加和行数据增加。
按列增加数据
按列增加数据主要用三种方式进行实现:
- 直接为DataFrame进行赋值
- 使用loc属性在DataFrame对象的最后增加一列
- 在指定位置插入一列 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