Pandas数据处理实战:清洗、排序、索引与选取全解析
本文系统讲解Pandas核心数据处理技巧,涵盖数据清洗(缺失值处理、重复值去重)、排序(索引与值排序)、索引管理(reindex、set_index、reset_index)及高效数据选取(loc、iloc、query)。通过具体代码示例,帮助开发者掌握从基础属性到高级操作的全流程方法,提升数据处理效率。
本教程面向已具备Pandas基础的用户,部分知识点将简略处理,不作深入展开。
Pandas数据结构概述
Series:一维标签数组
DataFrame:由多个Series组成的二维表格,每列对应一个Series
基础属性包括shape、index、columns、values,以及dtypes、describe()、head()和tail()等方法,用于快速获取数据概览。
Series统计属性:count()统计非空值总数,value_counts()统计各唯一值的出现频率。
df.isnull()返回布尔型DataFrame,空值位置为True。
df.notnull()返回布尔型DataFrame,非空值位置为True。
修改列名:使用rename方法调整列标签。
df.rename(columns = {'key':'key2'},inplace=True)
更改数据格式:使用astype()方法转换数据类型。
isin #计算一个“Series各值是否包含传入的值序列中”的布尔数组 unique #返回唯一值的数组 value_counts #返回一个Series,其索引为唯一值,值为频率,按计数降序排列
数据清洗流程
丢弃指定标签:使用drop()方法移除特定行或列。
df.drop(labels, axis=1)# 按列(axis=1),丢弃指定label的列,默认按行。。。
丢弃缺失值:dropna()方法移除包含空值的行或列。
# 默认axi=0(行);1(列),how=‘any' df.dropna()#每行只要有空值,就将这行删除 df.dropna(axis=1)#每列只要有空值,整列丢弃 df.dropna(how='all')# 一行中全部为NaN的,才丢弃该行 df.dropna(thresh=3)# 每行至少3个非空值才保留
填充缺失值:fillna()方法用指定值或策略填充NaN。
df.fillna(0)
df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5
df.fillna(method='ffill') #在列方向上以前一个值作为值赋给NaN
替换值:replace()方法将特定值替换为其他值。
# 将df的A列中 -999 全部替换成空值
df['A'].replace(-999, np.nan)
#-999和1000 均替换成空值
obj.replace([-999,1000], np.nan)
# -999替换成空值,1000替换成0
obj.replace([-999,1000], [np.nan, 0])
# 同上,写法不同,更清晰
obj.replace({-999:np.nan, 1000:0})
处理重复值:使用duplicated()识别、unique()获取唯一值、drop_duplicates()移除重复行。
df.duplicated()#两行每列完全一样才算重复,后面重复的为True,第一个和不重复的为false,返回true
#和false组成的Series类型
df.duplicated('key')#两行key这一列一样就算重复
df['A'].unique()# 返回唯一值的数组(类型为array)
df.drop_duplicates(['k1'])# 保留k1列中的唯一值的行,默认保留第一行
df.drop_duplicates(['k1','k2'], take_last=True)# 保留 k1和k2 组合的唯一值的行,take_last=True 保留最后一行
数据排序操作
索引排序:按索引标签对行或列进行排序。
# 默认axis=0,按行索引对行进行排序;ascending=True,升序排序 df.sort_index() # 按列名对列进行排序,ascending=False 降序 df.sort_index(axis=1, ascending=False)
值排序:按数据值大小对Series或DataFrame进行排序。
# 按值对Series进行排序,使用order(),默认空值会置于尾部 s = pd.Series([4, 6, np.nan, 2, np.nan]) s.order() df.sort_values(by=['a','b'])#按列进行排序
排名:使用rank()方法计算数据排名,支持多种排名策略。
a=Series([7,-5,7,4,2,0,4]) a.rank()#默认method='average',升序排名(ascending=True),按行(axis=0) #average 值相等时,取排名的平均值 #min 值相等时,取排名最小值 #max 值相等时,取排名最大值 #first值相等时,按原始数据出现顺序排名
索引设置与管理
reindex():重新定义索引,可选填充缺失值。
更新index或columns:调整索引或列标签。
默认行为:更新index并返回新的DataFrame,原索引被替换。
# 返回一个新的DataFrame,更新index,原来的index会被替代消失 # 如果dataframe中某个索引值不存在,会自动补上NaN df2 = df1.reindex(['a','b','c','d','e']) # fill_valuse为原先不存在的索引补上默认值,不在是NaN df2 = df1.reindex(['a','b','c','d','e'], fill_value=0) # inplace=Ture,在DataFrame上修改数据,而不是返回一个新的DataFrame df1.reindex(['a','b','c','d','e'], inplace=Ture) # reindex不仅可以修改 索引(行),也可以修改列 states = ["Texas","Utah","California"] df2 = df1.reindex( columns=states )
set_index():将现有列设置为新索引。
将DataFrame中的列转换为索引index。
构建层次化索引:通过多列组合创建多级索引。
# 将columns中的其中两列:race和sex的值设置索引,race为一级,sex为二级 # inplace=True 在原数据集上修改的 adult.set_index(['race','sex'], inplace = True) # 默认情况下,设置成索引的列会从DataFrame中移除 # drop=False将其保留下来 adult.set_index(['race','sex'], inplace = True)
reset_index():重置索引。
逆向操作set_index():将层次化索引还原。
取消层次化索引,将索引列恢复为普通列,并生成默认整数索引。
df.reset_index()
数据选取方法
[]
仅支持对行(索引)进行切片,采用前闭后开原则,如df[0:3]选取前4行,df[:4]选取前4行,df[4:]从第5行开始选取。
布尔筛选:使用where条件进行数据过滤。
df[df["A"]>7]
isin():判断值是否包含在指定序列中。
# 返回布尔值 s.isin([1,2,3]) df['A'].isin([1,2,3]) df.loc[df['A'].isin([5.8,5.1])]选取列A中值为5.8,5.1的所有行组成dataframe
query():使用字符串表达式进行数据查询。
组合多个条件:使用&表示与,|表示或,整合多个布尔筛选条件。
df.query(" A>5.0 & (B>3.5 | C<1.0) ")
loc:基于标签名称进行切片选取。
# df.loc[A,B] A是行范围,B是列范围 df.loc[1:4,['petal_length','petal_width']] # 需求1:创建一个新的变量 test # 如果sepal_length > 3 test = 1 否则 test = 0 df.loc[df['sepal_length'] > 6, 'test'] = 1 df.loc[df['sepal_length'] <=6, 'test'] = 0 # 需求2:创建一个新变量test2 # 1.petal_length>2 and petal_width>0.3 = 1 # 2.sepeal_length>6 and sepal_width>3 = 2 3.其他 = 0 df['test2'] = 0 df.loc[(df['petal_length']>2)&(df['petal_width']>0.3), 'test2'] = 1 df.loc[(df['sepal_length']>6)&(df['sepal_width']>3), 'test2'] = 2
iloc:基于整数位置进行切片选取。
df.iloc[1:4,:]
ix:混合标签与位置选取(已弃用,建议避免使用)。
名称与位置混合选取,但效率较低,建议少用。
df1.ix[0:3,['sepal_length','petal_width']]
map与lambda:对Series元素应用函数。
alist = [1,2,3,4] map(lambda s : s+1, alist)#map就是将自定义函数应用于Series每个元素 df['sepal_length'].map(lambda s:s*2+1)[0:3]
apply和applymap:对DataFrame的行/列或元素应用函数。
apply和applymap是对dataframe的操作,前者操作一行或者一列,后者操作每个元素 These are techniques to apply function to element, column or dataframe. Map: It iterates over each element of a series. df[‘column1'].map(lambda x: 10+x), this will add 10 to each element of column1. df[‘column2'].map(lambda x: ‘AV'+x), this will concatenate “AV“ at the beginning of each element of column2 (column format is string). Apply: As the name suggests, applies a function along any axis of the DataFrame. df[[‘column1','column2']].apply(sum), it will returns the sum of all the values of column1 and column2. df0[['data1']].apply(lambda s:s+1) ApplyMap: 对dataframe的每一个元素施加一个函数 func = lambda x: x+2 df.applymap(func), dataframe每个元素加2 (所有列必须数字类型)
contains:字符串模糊匹配筛选。
# 使用DataFrame模糊筛选数据(类似SQL中的LIKE)
# 使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次
df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')]
# 下面两句效果一致
df[df['商品名称'].str.contains("四件套")]
df[df['商品名称'].str.contains(r".*四件套.*")]
以上内容总结了Pandas数据清洗、排序、索引设置及选取的核心方法,供读者参考与实践。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









