感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
定位某行数据
重点:无论是 loc
还是 iloc
使用的要领都是先指定行,再指定列,并且行与列表达式用 ,
分隔。如:df.loc[:, :]
获取所有行所有列的数据。
使用 loc() 定位
比如现在要定位 [索隆] 这行数据,有以下
df.loc[1, :] # loc[index , columns] 行索引,列名,返回 Series 对象
df.loc[df['age'] > 18] # 返回 DataFrame 对象
# 或者 df[df['age'] > 18]
# df.loc[df['name'] == '索隆']
使用 iloc 定位
使用 iloc
取第二行(索引从0开始),所有列的数据。
df.iloc[1, :] # iloc[index1, index2] 行索引, 列索引
添加一行数据
使用 loc 定位并添加
使用 loc
定位到 index = 3
的行,再进行赋值**(在原数据上进行修改)**
df.loc[len(df)] = ['乔巴', 3]
使用 append 添加
append
添加数据时需要指定列名,列值,如果某列未指定的话,则默认填充 NaN
。
df.append({'name': '山治', 'age': 19}, ignore_index=True)
删除数据
根据列名删除列
使用 drop
来删除某列,指定要删除的轴,与对应 列/行 的 名称/索引。
df.drop('name', axis = 1) # 删除单列
df.drop(['name', 'age'], axis = 1) # 删除多列
根据索引删除行
与上面删除列的方式相似,不过这里指定的是索引。
df.drop(0, axis=0) # 删除单行
df.drop([0, 1], axis=0) # 删除多行
使用 loc 定位数据并删除
先使用 loc
定位某条件的数据,再获取索引 index
,然后使用 drop
删除。
df.drop(df.loc[df['name'] == '娜美'].index, axis=0) # 删除定位到的行
使用 del 删除列
del
是在原数据上进行修改,使用是要注意。
del df['age']
同时删除行、列
drop
也可以同时指定行列进行删除,这里删除第一、二行并删除 age
列。
df.drop(columns=['age'], index=[0, 1])
删除重复值
- 指定
subset
,则根据指定的列作为参考进行去重,即如果某两行a
值相同,则会删除第二次的出现的那一行,只保留第一次 - 不指定
subset
,则根据所有列作为参考进行去重,只有两行数据 完全相同 才会进行去重。
df.drop_duplicates(subset=['a'], keep='first')
df.drop_duplicates(keep='first')
筛查重复值
示例数据
df = pd.DataFrame({'name':['Python',
'Python',
'Java',
'Java',
'C'],
'count': [2, 2, 6, 8, 10]})
判断某列是否有重复值
使用 values_counts()
对列中各值出现次数进行统计。结果默认按照降序进行排列,只需要判断第一行值的出现次数是否为1即可判断是否存在重复值。
df['a'].value_counts()
使用 drop_duplicates()
对重复值进行删除,只保留第一次出现的值,判断处理后的值是否与原 df
相等,如果 False
就表示有重复值。
df.equals(df.drop_duplicates(subset=['a'], keep='first'))
False
判断 DataFrame 是否有重复行
同样是使用 drop_duplicates()
对重复值进行删除,只保留第一次出现的值,此时不使用 subset
参数设置列,默认为全部列,判断处理后的值是否与原 df
相等,如果 False
就表示有重复值。
df.equals(df.drop_duplicates(keep='first'))
False
统计重复行的数量
注意这里的统计是参照所有列来的,只有两行完全相同才会判断为重复行,所以统计的结果是 1 。
len(df) - len(df.drop_duplicates(keep="first"))
1
显示重复的数据行
先删除重复的行,只保留第一次出现的,得到一个 行唯一 的数据集,再使用 drop_duplicates()
删除掉 df
中存在重复的所有数据,这次不保留第一次出现的重复值,将上述两个结果集进行合并,使用 drop_duplicates()
对新生成的数据集进行去重,即可得到重复行的数据。
df.drop_duplicates(keep="first")\
.append(df.drop_duplicates(keep=False))\
.drop_duplicates(keep=False)
缺失值处理
查找缺失值
缺失值为 True
,非缺失值为 False
。
df.isnull()
查找非缺失值
非缺失值为 True
,缺失值为 False
。
df.notnull()
显示有缺失值的行
.isnull:查找缺失值,主要为了将缺失值的位置标 True
。
.T:行列转置,为下一步 any
做准备。
.any:一个序列中满足一个 True
,则返回 True
。
df[df.isnull().T.any()]
删除缺失值
这里的参数需要注意的比较多,这里着重讲一下。
- axis:0 行,1 列
- how:
- any:如果有 NaN,删除该行或列。
- all:如果所有值都是 NaN,删除该行或列。
- thresh:指定 NaN 的数量,当 NaN 数量达到才删除。
- subset:要考虑的数据范围,如:删除缺失行,就用subset指定参考的列,默认是所有列。
- inplace:是否修改原数据。
# 某行如果有缺失值,则删除这一行
df.dropna(axis=0, how='any')
# 某列如果有缺失值,则删除这一列
df.dropna(axis=1, how='any')
填充缺失值
数字或字符串填充
直接指定要填充的数字或字符串。
df.fillna(0)
用缺失值 前/后 的值填充
- 用缺失值的前一个值(该列上面一个值)填充,如果缺失值在第一行则不填充
- 用缺失值的后一个值(该列下面一个值)填充,如果缺失值在最后一行则不填充
df.fillna(method='pad')
df.fillna(method='bfill')
用缺失值所在列的 均值/中位数 等填充
可以用该列的统计信息来进行填充。如使用 mean
、median
、max
、min
、sum
填充等。
df.fillna(df.mean())
列操作
修改列名
df.columns
是直接指定新的列名来替换所有的列名。 (在原数据上进行修改)
rename()
需要指定原名与新名来进行替换。
df.columns = ['new\_name', 'new\_age']
df.rename(columns=({'name':'new\_name','age':'new\_age'}))
修改列类型
使用 astype
来修改列类型。
df['age'].astype(str)
将列进行拆分得到多列
split
只能对字符串列进行拆分。
df[['name1', 'name2']] = df['name'].str.split(',', expand=True)
将多列合并成新列
同样合并也是字符串类型的列才能进行合并。
df['all'] = df['name'] + '/' + df['age'].astype(str)
对数值列分区
对于数值列,实际使用的时候可能需要根据指定的范围,将这些数值变为标签值,如衡量产品的指标及格、不及格,成绩是否优秀等。使用是需要指定数值列、各个标签的临界值,临界值的开闭情况(示例中:默认 left=True
,指定 right=False
,即左闭右开),最后指定标签的名称即可。
df['评价'] = pd.cut(df['成绩'], [0, 60, 80, np.inf],
right=False, labels=['不及格', '良好', '优秀'])
排序
索引排序
对行索引降序排序
df.sort_index(axis=0, ascending=False)
对列索引降序排序
df.sort_index(axis=1, ascending=False)
重置索引
将索引重新排序,原来的索引不保留。
df.reset_index(drop=True)
值排序
先按照名字降序排序,再对相同名字下的成绩进行降序排序。
df.sort_values(by=['名字', '成绩'], axis=0, ascending=False)
创建排名列
使用 rank
来进行排名,主要参数 method
的取值含义如下:
method | 含义 |
---|---|
average | 默认值,在名次一样的分组中,为各个值分配平均排名(平均数),排名之间存在跳跃 |
min | 使用分组中的最小排名,排名之间存在跳跃 |
max | 使用分组中的最大排名,排名之间存在跳跃 |
first | 按值在原始数据中的出现顺序进行排名,排名之间存在跳跃 |
dense | 同一个分组的排名相同,排名之间不存在跳跃 |
现在按照 成绩 列对每行数据进行排名,并新建排名列,几种排名方式下面都已给出。
df['排名'] = df['成绩'].rank(method='average', ascending=False)
分组
对行分组统计
现在对各人的成绩进行分组计算,分别计算总和、均值、最大值。
df.groupby(['名字']).sum()
df.groupby(['名字']).mean()
df.groupby(['名字']).max()
注意:此时的索引为 名字,如果想要重置索引,可以使用如下方式。
df.groupby(['名字']).sum().reset_index()
对不同列使用不同的统计函数
agg()
是指定函数使用在某个数列上,然后返回标量值。
apply()
是先将数据拆分 >>> 再应用 >>> 最后汇总的过程(只能应用单个函数)。返回多维的数据。
df.groupby(['名字']).agg({'成绩':['sum','mean','max']})
df.groupby(['名字']).apply(max)
DataFrame合并
pandas中的合并函数主要是:merge()
、concat()
、append()
,一般用来连接两个及以上 DataFrame
。其中,concat()
, append()
用来纵向连接 DataFrame
对象, merge()
用来横向连接 DataFrame
对象。
三者对比:
concat()
- 连接多个DataFrame
- 设置特定的键(key)
append()
- 连接多个DataFrame
merge()
- 指定列来连接DataFrame
merge()
on
若指定则该列必须同时出现在这两个 DataFrame
中,默认值为两个 DataFrame
列中的交集,在本例中即使不指定 on
,实际默认值也会按照 name
列来进行合并。
how
参数详解:
- inner:根据
on
指定的列取交集。 - outer:根据
on
指定的列取并集。 - left:根据
on
指定的列并以左连接的方式合并。 - right:根据
on
指定的列并以右连接的方式合并。
pd.merge(df1, df2, on='name', how = "inner")
pd.merge(df1, df2, on='name', how = "outer")
pd.merge(df1, df2, on='name', how = "left")
pd.merge(df1, df2, on='name', how = "right")
concat()
concat()
可以多个 DataFrame
进行合并,根据实际情况可以选择纵向合并还是横向合并。具体看下面的示例。
# 多个DataFrame纵向合并取交集
pd.concat([df1, df2], ignore_index=True, join='inner',axis=0)
# 多个DataFrame纵向合并取并集
pd.concat([df1, df2], ignore_index=True, join='outer',axis=0)
# 多个DataFrame横向合并取交集
pd.concat([df1, df2], ignore_index=False, join='inner',axis=1)
# 多个DataFrame横向合并取并集
pd.concat([df1, df2], ignore_index=False, join='outer',axis=1)
另外还可以指定 key
,在索引的位置添加原数据的名称。
pd.concat([df1, df2], ignore_index=False, join='outer', keys=['df1', 'df2'])
append()
append()
常用于纵向合并,也可以多个 DataFrame
进行合并。
df1.append(df2, ignore_index=True)
df1.append([df1, df2], ignore_index=True)
最后
不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~
给大家准备的学习资料包括但不限于:
Python 环境、pycharm编辑器/永久激活/翻译插件
python 零基础视频教程
Python 界面开发实战教程
Python 爬虫实战教程
Python 数据分析实战教程
python 游戏开发实战教程
Python 电子书100本
Python 学习路线规划
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!