pandas 替换 某列大于_Pandas使用总结
前言
Pandas是机器学习三剑客之一,我们知道Numpy能够对数据进行很好的分析、操作、矩阵计算等,Pandas更侧重于数据的处理和分析,它的底层是使用Numpy实现的,在数据处理和分析方面提供了强大的功能。下面就总结一下日常使用操作。
程序运行环境:window10 Python3.7 (Anaconda) Pandas 1.0.1
编辑工具:jupyter
在日常数据分析中,经常使用的是CSV文件,本文也主要记录该文件的相关处理方式。
(补充:默认的csv文件是以“,”隔开的文本文件,使用excel打开时与xls文件类似)
相关文档可参考:Pandas中文文档[1] 、Pandas英文文档[2]
问题
数据预处理是做数据分析、数据挖掘、机器学习等的第一步。下面以泰坦尼克号乘客信息数据(titanic.csv)数据集做介绍。部分数据展示可参见对应jupyter数据文件。
通常使用pandas读取数据后会返回一个「DataFrame」数据结构,查看某一列(行)数据的数据类型返回一个「Series」,也就是说DataFrame由Series组成,读取数据是默认把第一行数据当作列名,可将一个DataFrame认为是一个二维数组数据结构。
# 读取数据
df = pd.read_csv('titanic.csv')
print(type(df)) # <class 'pandas.core.frame.DataFrame'>
# 查看数据
df.head() # 通常使用该方法查看前5条数据
df.tail() # 通常使用该方式查看最后5条数据情况
print(type(df['Name'])) # <class 'pandas.core.series.Series'>
「查看数据的基本信息」
DataFrame提供了info()方法,该方法返回DataFrame数据的样本规模、每列数据信息等。展示如下:
df.info()
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 PassengerId 891 non-null int64 1 Survived 891 non-null int64 2 Pclass 891 non-null int64 3 Name 891 non-null object 4 Sex 891 non-null object 5 Age 714 non-null float646 SibSp 891 non-null int64 7 Parch 891 non-null int64 8 Ticket 891 non-null object 9 Fare 891 non-null float6410 Cabin 204 non-null object 11 Embarked 889 non-null object
dtypes: float64(2), int64
memory usage: 83.7+ KB
"""
从结果中可以看出,数据891个实体,默认每一行为一个实体,一共12列,每列的信息也有所展示,例如对应的数据类型,object说明该数据类型为字符串,该文件在读到内存的大小等。
「查看数据的统计信息」
DataFrame提供了describe()方法,可以查看数据的个数、均值、标准差、最大值、最小值等信息。也可从中看出数据是否存在问题。
df.describe()
「查看某列各属性个数」
# 查看是否存活的个数
df['Survived'].value_counts()
# 指定按照个数从少到多排序
df['Survived'].value_counts(ascending=True)
# 对于其它具有更多类的数据可以分段显示,参数:bins = n,表示将连续的数据分为5组显示
「获取数据的列名」
df.columns # columns为其属性,不是一种方法
"""
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp','Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],dtype='object')
"""
「获取数据的索引」
df.index
"""
RangeIndex(start=0, stop=891, step=1)
"""
「获取每列数据对应的数据类型」
df.dtypes
"""
PassengerId int64
Survived int64
Pclass int64
Name object
Sex object
Age float64
SibSp int64
Parch int64
Ticket object
Fare float64
Cabin object
Embarked object
dtype: object
"""
「将DataFrame数据类型转为Numpy类型」
df.values # np.array(df) 也可
"""
array([[1, 0, 3, ..., 7.25, nan, 'S'],[2, 1, 1, ..., 71.2833, 'C85', 'C'],[3, 1, 3, ..., 7.925, nan, 'S'],...,[889, 0, 3, ..., 23.45, nan, 'S'],[890, 1, 1, ..., 30.0, 'C148', 'C'],[891, 0, 3, ..., 7.75, nan, 'Q']], dtype=object)
"""
「获取某列数据」
names = df['Name'] # 获取列名为Name的一列数据
names[:5] # names.values[:5] # 返回前5行np格式数据
"""
0 Braund, Mr. Owen Harris
1 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 Heikkinen, Miss. Laina
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
Name: Name, dtype: object
"""
「设置df中某一列为索引」
df = df.set_index('Name') # 设置'Name'列为数据的索引
df.index # 查看新索引, 也可使用df.head()查看新的df数据
"""
Index(['Braund, Mr. Owen Harris','Cumings, Mrs. John Bradley (Florence Briggs Thayer)',...'Johnston, Miss. Catherine Helen "Carrie"', 'Behr, Mr. Karl Howell','Dooley, Mr. Patrick'],dtype='object', name='Name', length=891)
"""
「通过索引定位某个具体值」
# 查看名字为"Braund, Mr. Owen Harris"的人存活情况
survived = df['Survived'] # 获取存活列(已经设置Name为索引列了)
survived['Braund, Mr. Owen Harris']
# 0
「二维数组数据块截取和赋值」
- 使用列名和行号获取
# 截取'Age'、'Fare'两列中第1,3,5,7,9行数据(行数从0开始)
df[['Age', 'Fare']][1:10:2]
「注:」 Name列为索引列,不可截取,或已经有对应关系了。
- 使用行号和列号获取(切片)
# 获取第0行数据
print(df.iloc[0])
# 获取第0行,前5列数据
print(df.iloc[0,0:5])
# 获取 前10中中偶数行,奇数列的数据
print(df.iloc[0:11:2,1::2]) # 说明0:11:2,从0开始到11,每次2个递增
- 使用标签截取数据
# 获取名为'Braund, Mr. Owen Harris'行数据,Name已设置为索引
df.loc['Braund, Mr. Owen Harris']
# 获取名为'Braund, Mr. Owen Harris'行中'Survied'属性
df.loc['Braund, Mr. Owen Harris', 'Survived']
# 也可以使用“:”连接切片开始和结束位置
df.loc['Braund, Mr. Owen Harris':'Allen, Mr. William Henry'] # 两个姓名索引之间的行
- 对于获取的数据可以使用等号对其进行赋值修改。
- 根据条件获取数据(使用bool类型)
# 获取所有年龄大于35的男性的前5条数据的平均年龄
res_df = df[df['Sex'] == 'male']
res_df[res_df['Age'] > 35][:5]['Age'].mean()
补充:pandas中对于df还有求平均值,求和等计算方法。
「创建DataFrame数据」
通过字典创建DataFrame数据
# key表示列名,value表示对应列的数据
data = {'A':[1,2,3],'B':['a','b','c']}
df_create = pd.DataFrame(data)
属性分离创建DataFrame数据
# 两行数据
data = [[i for i in range(5)], [i for i in range(5, 10)]]
cols_name = [i for i in 'abcde'] # 两列数据对应的列名
index = ['A', 'B'] # 索引
df_create = pd.DataFrame(data, index=index, columns=cols_name)
「设置显示数据最大行数」
pd.get_option('display.max_rows') # 查看当前能够显示数据最大行数
pd.set_option('display.max_rows', 10) # 设置能够显示数据的最大行数
「创建一个Series」
col = [i for i in range(5)]
s = pd.Series(data=col) # 使用默认索引
# s = pd.Series(data=col,index=[i for i in 'abcde']) # 自定义索引
补充:获取Series值和索引的操作与DataFrame相似,可使用loc、iloc方法,index方法。
「对某列数据进行+、-、x、等操作」
# 对Fare的值进行计算
df['Fare'] = (df['Fare'] + 10 - 5)*2 / 5
「查看各列数据之间的协方差」
df.cov() # 返回各列之间的协方差df
「查看各列数据之间的相关性」
df.corr() # 返回各列之间的相关系数df
「合并两个DataFrame」
- 两个df形状相同,按照共同的索引合并,索引相同
# 创建两个DF
df_a = pd.DataFrame({'key':['K0','K1','K2','K3'], 'A':['A0','A1','A2','A3'], 'B':['BO','B1','B2','B3']})
df_b = pd.DataFrame({'key':['K0','K1','K2','K3'], 'C':['CO','C1','C2','C3'],'D':['DO','D1','D2','D3']})
res = pd.merge(df_a, df_b, on='key')
res
"""
key A B C D
0 K0 A0 BO CO DO
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
"""
- 按照共同的索引合并,索引不同,保留相同部分
df_a = pd.DataFrame({'key1':['K0','K1','K2','K3'], 'key2':['K0','K1','K2','K3'],'A':['A0','A1','A2','A3'],'B':['BO','B1','B2','B3']})
df_b = pd.DataFrame({'key1':['K0','K1','K2','K3'],'key2':['K0','K1','K2','K4'], 'C':['C0','C1','C2','C3'], 'D':[' DO','D1','D2','D3']})
res = pd.merge(df_a, df_b, on=['key1', 'key2'])
print(res)
# 如果不舍弃不同的部分,添加how='outer',不同的部分用NaN(not a number)填充
# how='left',以第一个df为准,舍弃第二个df,right类似
# indicator=True 参数表明显示当前列来自于哪个df
"""
key1 key2 A B C D
0 K0 K0 A0 BO C0 DO
1 K1 K1 A1 B1 C1 D1
2 K2 K2 A2 B2 C2 D2
"""
- 纵向合并数据
pd.concat([df1,df2, ...], axis=0, ignore_index=True)
重置索引,axis=1则是水平合并,与Numpy有很多相似的地方。 - 使用join()方法合并操作与merge相类似,可参考官方文档。
「列数据排序」
import numpy as np
key = "abc"
data = pd.DataFrame({'type': [key[np.random.randint(3)] for i in range(10)], 'data': [np.random.randint(20) for i in range(10)],'others': [np.random.randint(50) for i in range(10)]})
print(data)
# 对type、data列进行排序,ascending指定对应列是否升序,inplace确定是否覆盖原来的值
data.sort_values(by=['type', 'data'], ascending=[True, False], inplace=True)
data
「数据缺失值处理」
pandas中缺失值通常使用NaN表示。
# 创建DataFrame,使用默认的索引已经列名
data = pd.DataFrame([range(3), [1, np.nan, 2], [1, 2, np.nan]])
data
"
0 1 2
0 0 1.0 2.0
1 1 NaN 2.0
2 1 2.0 NaN
"
通过isnull()函数判断缺失情况,返回形状和data相同的df,元素为True,False
查看数据缺失情况(是否有空值)
data.isnull().any() # 默认查看的是各列,any(axis=1)查看各行的缺失情况
"
0 False
1 True
2 True
dtype: bool
"
填充指定值
data.fillna(0) # 缺失值填充0
「删除重复数据」
data = pd.DataFrame({'col1':['a']*2 + ['b']*3, 'col2': [1, 1, 2, 2, 3]})
data.drop_duplicates()
# 参数 subset='col1' 留下col1列中不重复的数据
「删除有Nan的行或列」
data.drop_na() # 参数axis默认为0,删除NaN行 axis=1删除列 参数how默认any,只要存在Nan就删除,all,只有整行或整列时再删除。
「添加新的一列数据」
data = pd.DataFrame({'col1':['a']*2 + ['b']*3, 'col2': [1, 1, 2, 2, 3]})
data.assign(rataion = data['col1'] + "-new") # 新的列名为rataion 添加在最后一列
「使用apply自定义函数」
data = pd.DataFrame({'score':[np.random.randint(100) for i in range(10) ]})
def scoreLevel(series):if 0 <= series['score'] < 60:return "不及格"elif series['score'] < 70:return "及格"elif series['score'] < 80:return "中等"elif series['score'] < 90:return "良好"elif series['score'] <= 100:return "优秀"else:return "非法数字"
data['level'] = data.apply(scoreLevel, axis=1) # 处理对象为行,axis默认为0
这也是新增一列数据的方法。
# 统计泰坦尼克号数据各列中的空值个数
def nan_count(columns):columns_null = pd.isnull(columns) # 返回列,对应True、Falsenull = columns[columns_null] # 筛选出当前列中为空的数据return len(null) # 返回当前列为空数据的个数df.apply(nan_count) # 会遍历数据中所有的列(包括索引)
「根据起始时间以及时间间隔创建Series」
# 开始时间为 2020-03-14 08:00:00,每八小时采集一次数据
ser = pd.Series(pd.date_range(start='2020-03-14', periods=10, freq='8H'))
「翻转数据」
df.T # 等价于numpy中的矩阵转置 也可使用np.transpose(df)
「根据条件修改值」
df[df['Age'] > 80] = 80 # 将年龄大于80的设置为80
「将数据导出为pickle格式数据」
df.to_pickle("tantic.pickle")
「读取pickle格式数据」
pd.read_pickle('tantic.pickle')
总结
Pandas很强大,内容也不仅仅是这么多,就当我们入门啦!
Reference
[1] 中文文档: https://www.pypandas.cn/docs/
[2] Pandas英文文档: https://pandas.pydata.org/docs/index.html
pandas 替换 某列大于_Pandas使用总结相关推荐
- pandas 替换 某列大于_Pandas简单入门 1
1写在前面我是从16年开始学习Python的,在使用Python最开始的一段时间,基本是操作list列表和dict字典两个简单的数据结构,后来接触数据的特征越来越多,发现即使是嵌套字典记录数据也很困难 ...
- pandas 替换 某列大于_pandas数据分析总结大全(入门加进阶)
前言 python有个很好用的数据分析库pandas,前段时间做了个数据挖掘的比赛,里面数据分析的部分,是用pandas来实现的,今天借助自己实践的经验,来总结一下pandas常用的数据分析方法. 1 ...
- pandas 替换数字列中的字符串
使用pd.to_numeric(),注意需要设置errors="coerce",可以将字符串.None.NaN等都变为数字,最后的整列都会是数字类型 案例 import panda ...
- pandas计算含缺失值中列平均值_Pandas进阶修炼120题,给你深度和广度的船新体验...
来源:早起Python 本文约5800字,建议阅读15分钟. 本文为你介绍Pandas基础.Pandas数据处理.金融数据处理等方面的一些习题. Pandas 是基于 NumPy 的一种数据处理工具, ...
- pandas 每一列相加_Python3 numpy amp; pandas 学习笔记
写在前面 在用python做一些ML和DL的工作前,先看莫烦大佬的视频学习一下numpy和pandas这两个数据处理包,学习中记了一些笔记,便于自己日后查阅,同时发布到知乎希望能够帮助到其他小伙伴! ...
- python分两列输出_Pandas实现一列数据分隔为两列
分割成一个包含两个元素列表的列 对于一个已知分隔符的简单分割(例如,用破折号分割或用空格分割).str.split() 方法就足够了 . 它在字符串的列(系列)上运行,并返回列表(系列). >& ...
- Pandas选择一列或者多列数据
Pandas选择一列或者多列数据 目录 Pandas选择一列或者多列数据 #将要筛选的数据列添加到list中并使用[]
- Python使用pandas设置数据列中float数据类型的有效小数位数、抑制科学计数法
Python使用pandas设置数据列中float数据类型的有效小数位数.抑制科学计数法 目录
- php导出excel列数太多,php生成excel列名,超过26列大于Z问题解决办法
我们生成excel都会使用phpExcel类了,下面我来给大家介绍在生成excel列名超过26列大于Z问题解决办法吧. 这是phpExcel类中的方法.今天查到了,记录一下备忘.<?php pu ...
最新文章
- 解读:在什么业务场景适合使用Redis?
- 1011 A+B 和 C (15 分)(c语言)
- java外键实体类_java – 在Embeddable类中的外键映射
- python3 selenium_Python3+Selenium3自动化测试-(准备)
- leetcode103. 二叉树的锯齿形层次遍历(bfs)
- Google Maps API 进级:在信息窗口GInfoWindow中嵌入Flash动画
- python写入指定行_python文件操作如何写在指定的行
- POJ 3080 - Blue Jeans
- 通过chrome的拓展程序访问其他网页
- Wonderware-InTouch 报表查询SQL数据库,用表格控件做出的报表图例
- Mac上的windows 10系统,bootcamp 5更新 bootcamp 6,缺少bootcamp.msi
- C# ILDASM 使用
- python复制网页文字_我用Python在网上复制文字的几种实用方法
- 何为A站、B站、C站、D站、F站??
- 爬取《全职高手之巅峰荣耀》的豆瓣影评,分析漫改电影的优劣好坏
- 建议直接收藏,阿里巴巴开源15个顶级Java项目
- 揭秘IBM架构设计方法论 —— Solution Design II
- 2022-03-11 工作记录--PHP-eq(表示等于)、 neq(表示不等于)
- 联想笔记本电脑键盘灯怎么开启_联想键盘灯怎么开
- VUE+VSCODE(新建一个项目)
热门文章
- python批量生成word报告_Python操作Word批量生成合同的实现示例
- 牛年春节海报怎么设计?psd分层模板,给你灵感!
- APPLE苹果电子设备模型样机|展示你的专业设计最佳选择
- 哪里找电商素材模板?
- C++虚函数的实现原理(最通俗但并不想专业的解释)
- 检查CUDA的NVCC编译器和GPU加速卡
- 4G终端-基站-核心网 信令流与数据流
- linux变量循环赋值,shell脚本 循环变量赋值cf当前页面
- c++图的创建_「PS抠图系列13」通道混合器
- python 预测 位置_Python:核岭回归预测,KRR