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