[转载文章] 记录 Pandas 速查手册,可快速查找所需命令
转载自: 50个Pandas高级操作,建议收藏!
由 Rex Chow 879582094@qq.com 整理
复杂查询
实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据,接下来为大家介绍如何发挥
Pandas 数据筛选的无限可能,随心所欲地取用数据。
逻辑运算
1 2 3 4 df.Q1 > 36 ~(df.Q1 < 60 ) & (df['team' ] == 'C' )
逻辑筛选数据
切片([ ])、.loc[ ] 和
.iloc[ ] 均支持上文所介绍的逻辑表达式。
以下是切片([ ])的逻辑筛选示例:
1 2 3 4 df[df['Q1' ] == 8 ] df[~(df['Q1' ] == 8 )] df[df.name == 'Ben' ] df[df.Q1 > df.Q2]
以下是 .loc[ ] 和 .lic[ ] 示例:
1 2 3 4 5 6 7 df.loc[df['Q1' ] > 90 , 'Q1' ] df.loc[(df.Q1 > 80 ) & (df.Q2 < 15 )] df.loc[(df.Q1 > 90 ) | (df.Q2 < 90 )] df.loc[df['Q1' ] == 8 ] df.loc[df.Q1 == 8 ] df.loc[df['Q1' ] > 90 , 'Q1' :]
函数筛选
1 2 3 4 5 6 df.Q1[lambdas: max (s.index)] max (df.Q1.index)df.Q1[df.index == 99 ]
比较函数
1 2 3 4 5 6 df[df.Q1.eq(60 )] df.ne() df.le() df.lt() df.ge() df.gt()
查询query()
1 df.query('Q1 > Q2 > 90' )
还支持使用 @ 引入变量
1 2 3 4 a = df.Q1.mean() df.query('Q1 > @a+40' ) df.query('Q1 > `Q2` + @a' )
df.eval() 与 df.query()
类似,也可以用于表达式筛选。
1 2 3 df[df.eval ("Q1 > 90 > Q3 >10" )] df[df.eval ("Q1 > `Q2` + @a" )]
筛选filter()
1 2 3 4 5 6 7 df.filter (items=['Q1' , 'Q2' ]) df.filter (regex='Q' , axis=1 ) df.filter (regex='e$' , axis=1 ) df.filter (regex='1$' , axis=0 ) df.filter (like='2' , axis=0 ) df.filter (regex='^2' , axis=0 ).filter (like='Q' , axis=1 )
按数据类型查询
1 2 3 4 5 df.select_dtypes(include=['float64' ]) df.select_dtypes(include='bool' ) df.select_dtypes(include=['number' ]) df.select_dtypes(exclude=['int' ]) df.select_dtypes(exclude=['datetime64' ])
数据类型转换
在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。
1 2 3 4 df = pd.DataFrame(data, dtype='float32' ) df = pd.read_excel(data, dtype={'team' :'string' , 'Q1' : 'int32' })
推断类型
1 2 3 df.infer_objects() df.infer_objects().dtypes
指定类型
1 2 3 4 5 6 7 8 9 10 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(df[['year' , 'month' , 'day' ]])
🙋关于错误处理详细说明: pandas.to_datetime
— pandas 1.5.3 documentation
以下援引原文: (v1.5.3 )
errors {‘ignore’, ‘raise’, ‘coerce’}, default
‘raise’
If 'raise', then invalid parsing will raise an
exception.
If 'coerce', then invalid parsing will be set as
NaT.
If 'ignore', then invalid parsing will return the
input.
类型转换astype()
1 2 3 df.Q1.astype('int32' ).dtypes df.astype({'Q1' : 'int32' ,'Q2' :'int32' }).dtypes
转为时间类型
1 t = pd.Series(['20200801' , '20200802' ])
数据排序
数据排序是指按一定的顺序将数据重新排列,帮助使用者发现数据的变化趋势,同时提供一定的业务线索,还具有对数据纠错、分类等作用。
索引排序sort_index()
1 2 3 4 5 6 7 8 9 10 11 12 s.sort_index() df.sort_index() df.team.sort_index() s.sort_index(ascending=False ) s.sort_index(inplace=True ) s.sort_index(ignore_index=True ) s.sort_index(na_position='first' ) s.sort_index(level=1 ) s.sort_index(level=1 , sort_remaining=False ) df.sort_index(axis=1 )
数值排序sort_values()
1 2 3 df.Q1.sort_values() df.sort_values('Q4' ) df.sort_values(by=['team' , 'name' ],ascending=[True , False ])
其他方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 s.sort_values(ascending=False ) s.sort_values(inplace=True ) s.sort_values(na_position='first' ) df.sort_values(by=['team' ]) df.sort_values('Q1' ) df.sort_values(by=['team' , 'Q1' ]) df.sort_values(by=['team' , 'Q1' ], ascending=False ) df.sort_values(by=['team' , 'Q1' ],ascending=[True , False ]) df.sort_values('team' , ignore_index=True )
混合排序
1 2 3 df.set_index('name' , inplace=True ) df.index.names = ['s_name' ] df.sort_values(by=['s_name' , 'team' ])
按值大小排序nsmallest()和nlargest()
1 2 3 4 5 6 s.nsmallest(3 ) s.nlargest(3 ) df.nlargest(3 , 'Q1' ) df.nlargest(5 , ['Q1' , 'Q2' ]) df.nsmallest(5 , ['Q1' , 'Q2' ])
添加修改
数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误、格式转换,数据的类型修改等。
修改数值
1 2 3 4 5 6 7 8 9 10 11 12 13 df.iloc[0 ,0 ] df.iloc[0 ,0 ] = 'Lily' df.iloc[0 ,0 ] df[df.Q1 < 60 ] = 60 df.Q1 v = [1 , 3 , 5 , 7 , 9 ] * 20
替换数据
1 2 3 4 5 6 7 8 s.replace(0 , 5 ) df.replace(0 , 5 ) df.replace([0 , 1 , 2 , 3 ], 4 ) df.replace([0 , 1 , 2 , 3 ], [4 , 3 , 2 , 1 ]) s.replace([1 , 2 ], method='bfill' ) df.replace({0 : 10 , 1 : 100 }) df.replace({'Q1' : 0 , 'Q2' : 5 }, 100 ) df.replace({'Q1' : {0 : 100 , 4 : 400 }})
填充空值
1 2 3 4 5 6 df.fillna(0 ) df.fillna(method='ffill' ) values = {'A' : 0 , 'B' : 1 , 'C' : 2 , 'D' : 3 } df.fillna(value=values) df.fillna(value=values, limit=1 )
🙋关于填充方法, 详细说明: pandas.DataFrame.bfill
— pandas 1.5.3 documentation
以下援引原文: (v1.5.3 )
method {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None},
default None
Method to use for filling holes in reindexed Series pad / ffill:
propagate last valid observation forward to next valid backfill / bfill:
use next valid observation to fill gap.
翻译整理下:
pad/ffill:
将上一个有效观测值向前传播到下一个有效观察值,
即向前填充
backfill/bfill:
使用下一个有效的观察来填补空白。即向后填充
修改索引名
1 df.rename(columns={'team' :'class' })
常用方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 df.rename(columns={"Q1" :"a" , "Q2" : "b" }) df.rename(index={0 : "x" , 1 :"y" , 2 : "z" }) df.rename(index=str ) df.rename(str .lower, axis='columns' ) df.rename({1 : 2 , 2 : 4 }, axis='index' ) s.rename_axis("animal" ) df.rename_axis("animal" ) df.rename_axis("limbs" , axis="columns" ) df.rename_axis(index={'type' : 'class' }) s.set_axis(['a' , 'b' , 'c' ], axis=0 ) df.set_axis(['I' , 'II' ], axis='columns' ) df.set_axis(['i' , 'ii' ], axis='columns' ,inplace=True )
增加列
1 2 3 4 5 6 7 8 9 10 df['foo' ] = 100 df['foo' ] = df.Q1 + df.Q2 df['foo' ] = df['Q1' ] + df['Q2' ] df['total' ] = df.select_dtypes(include=['int' ]).sum (1 ) df['total' ] = df.loc[:, 'Q1' :'Q4' ].apply(lambda x: sum (x), axis='columns' ) df.loc[:, 'Q10' ] = '我是新来的' df.loc[df.num >= 60 , '成绩' ] = '合格' df.loc[df.num < 60 , '成绩' ] = '不合格'
插入列insert()
1 2 df.insert(2 , 'total' , df.sum (1 ))
指定列assign()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 df.assign(total=df.sum (1 )) df.assign(total=df.sum (1 ), Q=100 ) df.assign(total=df.sum (1 )).assign(Q=100 ) df.assign(Q5=[100 ]*100 ) df = df.assign(Q5=[100 ]*100 ) df.assign(Q6=df.Q2 / df.Q1) df.assign(Q7=lambda d: d.Q1 * 9 / 5 + 32 ) df.assign(tag=df.Q1 > df.Q2) df.assign(tag=(df.Q1 > df.Q2).astype(int )) df.assign(tag=(df.Q1 > 60 ).map ({True : '及格' , False : '不及格' })) df.assign(Q8=lambda d: d.Q1 * 5 , Q9=lambda d: d.Q8 + 1 )
执行表达式eval()
1 2 df.eval ('total = Q1 + Q2 + Q3 + Q4' )
其他方法:
1 2 3 4 5 df['C1' ] = df.eval ('Q2 + Q3' ) df.eval ('C2 = Q2 + Q3' ) a = df.Q1.mean()df.eval ("C3 =`Q3` + @a" ) df.eval ("C3 = Q2 > (`Q3` + @a)" ) df.eval ('C4 = name + team' , inplace=True )
增加行
1 2 df.loc[100 ] = ['tom' , 'A' , 88 , 88 , 88 , 88 ]
其他方法:
1 2 3 4 5 6 7 df.loc[101 ] = {'Q1' : 88 ,'Q2' : 99 } df.loc[df.shape[0 ] + 1 ] = {'Q1' : 88 ,'Q2' : 99 } df.loc[len (df) + 1 ] = {'Q1' : 88 , 'Q2' : 99 } rows = [[1 , 2 ], [3 , 4 ], [5 , 6 ]] for row in rows: df.loc[len (df)] = row
追加合并
1 2 3 df = pd.DataFrame([[1 , 2 ], [3 , 4 ]], columns=list ('AB' )) df2 = pd.DataFrame([[5 , 6 ], [7 , 8 ]], columns=list ('AB' )) df.append(df2)
删除
删除空值
1 2 3 4 5 df.dropna() df.dropna(axis='columns' ) df.dropna(how='all' ) df.dropna(thresh=2 ) df.dropna(inplace=True )
🙋关于丢弃空值的详细说明: pandas.DataFrame.dropna
— pandas 1.5.3 documentation
以下援引原文: (v1.5.3 )
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
Determine if rows or columns which contain missing values are
removed.
0, or ‘index’ : Drop rows which contain missing values.
1, or ‘columns’ : Drop columns which contain missing value.
Changed in version 1.0.0: Pass tuple or list to drop on
multiple axes. Only a single axis is allowed.
how : {‘any’, ‘all’}, default ‘any’
Determine if row or column is removed from DataFrame, when we have at
least one NA or all NA.
‘any’ : If any NA values are present, drop that row or column.
‘all’ : If all values are NA, drop that row or column.
thresh : int, optional
Require that many non-NA values. Cannot be combined with how.
高级过滤
介绍几个非常好用的复杂数据处理的数据过滤输出方法。
df.where()
np.where()
1 2 np.where(df >= 60 , '合格' , '不合格' )
df.mask()
df.lookup()
1 2 3 df.lookup([1 , 3 , 4 ], ['Q1' , 'Q2' , 'Q3' ]) df.lookup([1 ], ['Q1' ])
数据迭代
迭代Series
1 2 3 4 5 6 for i in df.name: print (i) for i,n,q in zip (df.index, df.name,df.Q1): print (i, n, q)
df.iterrows()
1 2 3 for index, row in df.iterrows(): print (index, row['name' ], row.Q1)
df.itertuples()
1 2 for row in df.itertuples(): print (row)
df.items()
1 2 3 4 for label, ser in df.items(): print (label) print (ser[:3 ], end='\n\n' )
按列迭代
1 2 3 for column in df: print (column)
函数应用
pipe()
应用在整个DataFrame或Series上。
1 2 3 4 f(g(h(df), arg1=a), arg2=b, arg3=c) (df.pipe(h).pipe(g, arg1=a).pipe(f, arg2=b, arg3=c))
apply()
应用在DataFrame的行或列中,默认为列。
1 2 df.name.apply(lambda x: x.lower())
applymap()
应用在DataFrame的每个元素中。
1 2 3 4 5 def mylen (x ): return len (str (x)) df.applymap(lambda x: mylen(x)) df.applymap(mylen)
map()
应用在Series或DataFrame的一列的每个元素中。
1 2 df.team.map ({'A' : '一班' , 'B' : '二班' ,'C' : '三班' , 'D' : '四班' ,}) df['name' ].map (f)
agg()
数据聚合方法
pandas.DataFrame.agg
— pandas 1.5.3 documentation
1 2 3 4 5 6 7 8 9 df.agg('max' ) df.agg(['sum' , 'min' ]) df.agg({'Q1' : ['sum' , 'min' ], 'Q2' : ['min' ,'max' ]}) df.groupby('team' ).agg('max' ) df.Q1.agg(['sum' , 'mean' ])
pandas.DataFrame.transform
— pandas 1.5.3 documentation
1 2 df.transform(lambda x: x*2 ) df.transform([np.sqrt, np.exp])
copy()
拷贝方法, 如果不清楚返回的结果是View还是数据,
可以使用拷贝方法产出副本
pandas.DataFrame.copy
— pandas 1.5.3 documentation
1 2 3 4 5 s = pd.Series([1 , 2 ], index=["a" ,"b" ]) s_1 = s s_copy = s.copy() s_1 is s s_copy is s
学术分享,转自:https://zhuanlan.zhihu.com/p/568250201