比较系统的学习 pandas(5)

pandas 常见的高级操作

1、进行复杂查询

由于不好描述,就举几个栗子吧,不明白的可以私聊我

1、pnadas 支持逻辑计算与位运算

对DataFrame的一列进行逻辑计,会产生一个对应的由布尔值组成的Series,真假值由此位上的数据 是否满足逻辑表达式决定。

data["语文"] > 60

data["数学"] == 100

2、根据逻辑运算进行筛选数据

切片([])、.loc[]和.iloc[]均支持的逻辑表达式。

data[data['语文'] == 150]
data[~(data['语文'] == 150)]  #语文值不等于150的 
data[data["name"] == '慕晨风'] # 姓名为慕晨风
df[data["语文"] > data["数学"]


# 表达式与切片一致
data.loc[data["语文"] > 90, '语文':] # 语文值大于90,且只显示语文
data.loc[(data["语文"] > 80) & (data["数学"] > 120)] # and关系
data.loc[(data["语文"] > 90) | (data["英语"] < 90)] # or关系
data.loc[data["语文"] == 120]  
data.loc[data['语文'] > 90, '语文':] # 语文大于90,显示语文及其后所有列

注意 : 在进行或(|)、与(&)、非(~)运算时,各个独 立逻辑表达式需要用括号括起来

3、进行函数筛选

可以在表达式处使用lambda函数,默认变量是其操作的对象。如果 操作的对象是一个DataFrame,那么变量就是这个DataFrame;如果是一 个Series,那么就是这个Series

data[lambda data: data['语文'] == 120] # 语文为120

data.loc[:, lambda data: [i for i in data["name"] if '慕' in i]] # 返回 name列中带有 慕 字的名字列表


比较函数(一般不使用)

data.ne() # 不等于 !=
data.le() # 小于等于 <=
data.lt() # 小于 <
data.ge() # 大于等于 >=
data.gt() # 大于 >
data.eq() #等于


eg:   data[data["语文"].eq(150)]



data.isin()

data.isin()   #判断数据是否包含指定内容

data[data.team.isin(['A','B'])] # 包含A、B两组
data[data.isin({'team': ['C', 'D'], 'Q1':[100,120]})] # 复杂查询,其他值为NaN

data.query()

data.query()使用布尔表达式查询DataFrame的列,表达式是一个 字符串,类似于SQL中的where从句,不过它相当灵活

data.query('语文 + 数学 > 180')
df.query('语文 == 英语')

data.filter() 

data.filter()可以对行名和列名进行筛选,支持模糊匹配、正则表达式

data.filter(regex='1$', axis=0) # 正则,索引名以1结尾

4、根据数据类型查询

Pandas提供了一个按列数据类型筛选的功能 df.select_dtypes(include=None, exclude=None),它可以指定包含和不包含 的数据类型,如果只有一个类型,传入字符;如果有多个类型,传入列表.

如果没有满足条件的数据,会返回一个仅有索引的DataFrame。

data.select_dtypes(include=['float64']) # 选择float64型数据

data.select_dtypes(include='bool')

data.select_dtypes(include=['number']) # 只取数字型

data.select_dtypes(exclude=['int']) # 排除int类型

data.select_dtypes(exclude=['datetime64'])

2、数据类型转换

在开始数据分析前,有时需要为数据分配好合适的类型,这样才能 够高效地处理数据

# 对所有字段指定统一类型
data= pd.DataFrame(data, dtype='float32')
# 对每个字段分别指定
data = pd.read_excel(data.xlsx, dtype={'name': 'string', 'score': 'int32'})

1、指定数据DataFrame或Series类型

# 按大体类型推定
m = ['1', 2, 3]

s = pd.to_numeric(s) # 转成数字

pd.to_datetime(m) # 转成时间

pd.to_timedelta(m) # 转成时间差

pd.to_datetime(m, errors='coerce') # 错误处理

pd.to_numeric(m, errors='ignore')

pd.to_numeric(m errors='coerce').fillna(0) # 兜底填充

pd.to_datetime(data[['year', 'month', 'day']]) # 组合成日期

注意 : pd.to_datetime() 很重要

细讲pd.to_datetime() 函数

pd.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin='unix', cache=True)

常用参数解析:

arg:int,float,str,datetime,list,tuple,1-d数组,Series,DataFrame / dict-like,要转换为日期时间的对象

errors:{'ignore','raise','coerce'},默认为'raise'

        如果为“ raise”,则无效的解析将引发异常

        如果为“coerce”,则将无效解析设置为NaT

        如果为“ ignore”,则无效的解析将返回输入

format:str,格式,default None,解析时间的strftime,eg :   “%d /%m /%Y”。

详情https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

2、类型转换函数 astype()

一般都使用 astype()操作数据转换。

data.index.astype('int64') # 索引类型转换

data.astype('int32') # 所有数据转换为int32

data.astype({'列名1': 'int32'}) # 指定字段转指定类型

data.astype('int64', copy=False) # 不与原数据关联

data['name'].astype('object')  #name列转换为 object 类型

data["状态"].astype("bool")

s.astype('datetime64[ns]') #转化为时间类型

当数据的格式不具备转换为目标类型的条件时,需要先对数据进行 处理。例如"89.3%"是一个字符串,要转换为数字,要先去掉百分号:

# 将"89.3%"这样的文本转为浮点数
data.rate.apply(lambda x: x.replace('%', '')).astype('float')/10

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕.晨风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值