前言
本来看到这个title的时候。。。我是拒绝的。。。因为这不是我应该看的东西,好歹我也是用了pandas好几年的人,是不是,什么基本必要的功能我不知道??写这个部分简直是侮辱我。。。
但是。。。看着看着突然发现,这是啥,那又是个啥。。。我。。。。。。
王境泽:真香。。
涉及内容
- 首尾节选 :
.head() .tail()
# 前面可以是dataframe也可以是Series...so我省略掉了,下面同理。- 四则运算plus :
.add() .sub() .mul() .div() .radd() .rub() .divmod()
# 加减乘除那些。。。也真的很基础,最后一个divmod返回整除的结果与余数- 布尔运算与操作 :
.eq() .gt() .ne() .lt() .any() .all() .empty() .bool()
,其中any all
是经常需要使用的函数,因为一个pandas的object在python中是不能直接转化为布尔值的。一个非空的list
就是一个True
,而一个Series
就会报错,需要使用any all empty bool
这些进行转化和提取。- 合并同样本数据(降维):合并存在overlap的数据,(e.g同样本但不同时期的数据)。
.combine_first(df)
,在处理不在意不同时间段的数据是,可以有效、迅速合并多个相同index、column的数据(去除NaN的值)。同时也可以使用.combine(df,combine_method)
- 常用的统计方法:
.count() .sum() .mean() .median() .mad() .min() .max() .abs() .std() .skew() .quantile() .cumsum() .cumprod() .cummax()
,其中都可以apply的轴。- 最大最小值的index:
.idxmax() .idxmin()
直接返回最大、最小值的index- Bining数据:如果需要Bining数据,可以直接使用
pd.cut() pd.qcut()
,要求需要bin的数目。后者是基于quantiles进行bining,所以要求input切分的百分位构成的list。- apply类似的函数使用:
.pipe() .apply() .agg() .transform() .applymap()
的区别- 重置index:
.reindex() .reindex_like()
,前者是在高版本后经常会被用作提醒的函数。后者则是为了对齐两个/多个df时使用的,相当于前者的一个wrapper版本。- 删除行列、重命名index/columns:
.drop() .rename()
,前者可用于丢一行/列,后者则可以通过字典的方法进行名称的重命名。- 遍历:
.iterrows() .iteritems() .itertuples()
,不同的遍历函数,不赘述。- Series中的多种string方法可以提供快速处理一个series中的所有字符串,并且最重要的是可以有效避开
NaN
的值。- 排序
- 拷贝,注意deepcopy与copy的区别
- Dtype
- 基于类型来进行选择。!!!神奇,还有这个函数。
.select_dtypes()
布尔的转化
- 对含多个元素的对象,使用
any all
对其进行转化 - 如果只含有单个元素,但可能维数比较高,此时可以是用
bool
直接将其取出(不是判断是否为空) - 如果相判断其是否为空,可以使用
empty
,直接就会转化为单个的True / False
相互的比较
- 可以直接使用常规的比较操作符
== >= <
之类的,返回的是一个等大小的True False
的矩阵 - 如果想要得到单个的True/False的话,可以直接使用
A.equals(B)
的操作(必须存在一致的Order/Index)。 -
需要注意的是,
NaN
是个Instance,所以每个NaN之间是不相等的。 - 长度、形状不同的比较会报错。(与Numpy的处理不一样)
合并
-
combine_first
是combine
的特殊应用,后者需要input一个自定义的方法,combiner = lambda x, y: np.where(pd.isna(x), y, x)
即前者所使用的combine方法,可以作为参考,接受的两个参数均为df。
多种function application的区别
- Tablewise 的函数应用,使用
.pipe()
,接受一个完整的df。
e.gf(g(h(df), arg1=1), arg2=2, arg3=3) 等价于 (df.pipe(h).pipe(g, arg1=1).pipe(f, arg2=2, arg3=3) )
- row-wise/col-wise的函数应用,使用
.apply()
,传给apply的函数接受的参数应该是一个Series或者一个array(apply(raw=True),可以有效提升性能),function返回的是Series
则最终返回DataFrame,function返回的是int , float
之类的话则最终返回Series。 - 若希望同时得到多个function的计算结果,则需要使用
.agg()
,类似于apply,但是可以同时传入多个function(可以用list,也可以用dict),然后得到一个以function名字为index的多个function结果的新df。.describe()的实现本质。 - 同上的。
.transform()
是一个类似于agg的函数。 - Element-wise的函数操作,则使用
.applymap()
,每次接受一个值作为输入,输出同样是一个值。
ReIndex
总体而言是一个重置Index/columns的方法,但是细的来说,有三种能够通过reindex来实现的操作。
- 重排样本
- 插入NaN样本,如果提供的list存在新的值
- 对于时间序列数据,可以使用
fill_value
参数控制缺失的样本的值。
对于.reindex_like(),其帮助信息中有一句,其相当于s.reindex(index=other.index,columns=other.columns)
如果为了对齐几个矩阵,还有一个叫.align()
的方法,具官方说是最快对齐两个object的方法。使用的方法也十分简单,这里也就不加赘述。
排序
- 按照index排序,了解一下
.reindex()
- 按照值排序,了解一下
.sort_values()
- 按照提供的值进行排序,返回可插入的index。了解一下
.searchshorted()
- 返回前n个最大/小值,了解一下
.nsmallest() .nlargest()
类型
如何查看所有的dtype与其继承关系呢!
def subdtypes(dtype):
subs = dtype.__subclasses__()
if not subs:
return dtype
return [dtype, [subdtypes(dt) for dt in subs]]
网友评论