Pandas复杂查询、数据类型转换、数据排序

Pandas高级操作

1、复杂查询

(1)逻辑运算

  • 以DataFrame其中一列进行逻辑计算,会产生一个对应的bool值组成的Series

  • 于是我们可以利用返回的bool列表进行一系列的数据查询

(2)逻辑筛选数据

  df[df['Q1'] == 8] # Q1 等于8
  df[~(df['Q1'] == 8)] # 不等于8

🧙

  • 进行与或非的操作时,各个独立的逻辑表达式记得要加括号,不然报错
  • df['Q2']等价于df.Q2

(3)函数筛选

  df[lambda df: df['Q1'] == 8] # Q1为8的数据,返回dateframe
  df.loc[lambda df: df.Q1 == 8, 'Q1':'Q2'] # Q1为8的, 显示 Q1 Q2

🧙

  • 表达式可以用lambda函数代替,默认传入的变量是其操作对象

(4)比较函数

  df.eq() # 等于相等 ==
  df.ne() # 不等于 !=
  df.le() # 小于等于 >=
  df.lt() # 小于 <
  df.ge() # 大于等于 >=
  df.gt() # 大于 >
  # 都支持  axis{0 or ‘index’, 1 or ‘columns’}, default ‘columns’
  df[df.Q1.ne(89)] # Q1 不等于8
  df.loc[df.Q1.gt(90) & df.Q2.lt(90)] # and 关系 Q1>90 Q2<90

  # isin,该方法返回一个bool列表
  df[df.team.isin(['A','B'])] # 包含 AB 两组的
  df[df.isin({'team': ['C', 'D'], 'Q1':[36,93]})] # 复杂查询,其他值为 NaN

(5)查询df.query

  df.query('Q1 > Q2 > 90') # 直接写类型 sql where 语句
  df.query('Q1 + Q2 > 180')

(6)筛选df.filter

  df.filter(items=['Q1', 'Q2']) # 选择两列
  df.filter(regex='Q', axis=1) # 列名包含Q的数据,返回dataframe
  df.filter(regex='1$', axis=0) # 正则, 索引名包含1的
  df.filter(like='2', axis=0) # 索引中有2的,返回dataframe
  # 索引中2开头列名有Q的
  df.filter(regex='^2', axis=0).filter(like='Q', axis=1)

(7)按数据类型查询

  df.select_dtypes(include=['float64']) # 选择 float64 型数据
  df.select_dtypes(include='bool')
  df.select_dtypes(include=['number']) # 只取数字型
  df.select_dtypes(exclude=['int']) # 排除 int 类型

2、数据类型转换

(1)推断类型

  # 自动转换合适的数据类型
  df.convert_dtypes() # 推荐!新的方法,支持 string 类型
  df.infer_objects()

(2)指定类型pd.to_xxx()

  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(df[['year', 'month', 'day']]) # 组合成日期

(3)类型转换 astype()

  df.dtypes # 查看数据类型
  df.index.astype('int64') # 索引类型转换
  df.astype('int32') # 所有数据转换为 int32
  df.astype({'col1': 'int32'}) # 指定字段转指定类型

3、数据排序

(1)索引排序 sort_index()

  s.sort_index() # 升序排列
  df.sort_index() # df 也是按索引进行排序
  df.team.sort_index()
  s.sort_index(ascending=False) # 降序排列
  s.sort_index(inplace=True) # 排序后生效,改变原数据

(2)数值排序 df.reindex()

  • 指定自己定义顺序的索引,实现行和列的顺序重新定义:

(3)混合排序 sort_values()

  # df 按指定字段顺序
  df.sort_values(by=['team'])
  df.sort_values('Q1')
  # 按多个字段,先排 team, 在同 team 内再看 Q1
  df.sort_values(by=['team', 'Q1'])

posted @ 2022-04-23 20:53  朝南烟  阅读(218)  评论(0编辑  收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }