1、cum累积计算和rolling滚动计算
Pandas主要统计特征函数
计算出前n项和:
D=pd.Series(range(0,20))
D.cumsum()
0 0
1 1
2 3
3 6
....
19 190
dtype: int64
rolling滚动计算函数
rolling_系列是pandas的函数,不是DataFrame或Series对象的方法,其格式为pd.rolling_mean(D,k),其中列中每k行计算一次平均值,滚动计算。
依次对相邻两项求和:
pd.rolling_sum(D,2)
0 NaN
1 1.0
2 3.0
3 5.0
4 7.0
....
19 37.0
dtype: float64
注意:pandas到了后面版本不支持rolling_mean函数,具体请参考 https://stackoverflow.com/questions/50482884/module-pandas-has-no-attribute-rolling-mean
2、pandas的筛选
在进行数据分析与清理中,我们可能常常需要在数据集中去掉某些异常值。具体来说,看看下面的例子。
数据集df中,对于属性appPlatform(最后一列),我们想删除掉取值为2的那些样本。
如何做?非常简单。
import pandas as pd
df[(True-df['appPlatform'].isin([2]))]
当然,有时候我们需要去掉不止一个值,这个时候只需要在isin([])的列表中添加。更具体来说,例如,对于appID这个属性,我们想去掉appID=278和appID=382的样本。
df[(True-df['appID'].isin([278,382]))]
另外,我们有时候并不只是考虑某一列,还需要考虑另外若干列的情况。例如,我们需要过滤掉appPlatform=2而且appID=278和appID=382的样本呢?非常简单。
df[(True-df['appID'].isin([278,382]))&(True-df['appPlatform'].isin([2]))]
.其实,在这里我们看到,就是由两部分组成的,第一部分就是appID中等于278和382的,另外一部分就是appPlatform中等于2的。两者取逻辑关系 与(&)
上面我们是了解了如何取掉某个具体值,下面,我们要看看如何过滤掉某个范围的值。
对于数据集df,我们想过滤掉creativeID(第一列)中ID值大于10000的样本。
df[df['creativeID']<=10000]
另外,如果要考虑多列的话,其实和上面一样,将两种情况做逻辑与(&)就可以,不过值得注意的是,每个条件要用括号()括起来。
3、判断空值
1、np.isnan(只有数组数值运算时可使用)
注意:numpy模块的isnan方法仅支持对数值进行判断,因此传入的如果是字符串类型会报错
2、is np.nan(不建议使用)
如果我们的空值只会出现由numpy模块的nan,或只想判断由numpy模块生成的nan值,可以使用,但其他场合一律不建议使用
注意:因为math模块同样可以产生nan值,且math.nan由is np.nan判断是False,例如下面代码
a = math.nan
b = np.nan
a is b
Out[19]: False
np.isnan(a)
Out[20]: True
np.isnan(b)
Out[21]: True
a is np.nan
Out[22]: False
b is np.nan
Out[23]: True
3、pd.isna(大部分数据处理的场合推荐使用)
如果我们的空值既会出现np.nan,也会出现math.nan,甚至还会出现None,或者要判断的数据值既可能是数值型也可能是字符串(符合大部分场景的实际情况),墙裂推荐使用pd.isna,例如下面代码
pd.isna(np.nan)
Out[29]: True
pd.isna(math.nan)
Out[30]: True
pd.isna(None)
Out[31]: True
pd.isna('a')
Out[32]: False
pd.isna(10)
Out[33]: False
4、pandas-DataFrame列移动
这个列移动借助pop完成
df.pop(列名)
df.insert(列的位置,列名,Series)
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])
c = df.pop('c') #pop出一个Series
df.insert(4,'c_new',c) #相当于在第4列的位置,添加列名为c_new的列c
print(df) #for test
5、Pandas删除数据
开始之前,pandas中DataFrame删除对象可能存在几种情况
1、删除具体列
2、删除具体行
3、删除包含某些数值的行或者列
4、删除包含某些字符、文字的行或者列
本文就针对这四种情况探讨一下如何操作。
数据准备
模拟了一份股票交割的记录。
In [1]: import pandas as pd
In [2]: data = {
...: '证券名称' : ['格力电器','视觉中国','成都银行','中国联通','格力电器','视觉中国','成都银行','中国联通'],
...: '摘要': ['证券买入','证券买入','证券买入','证券买入','证券卖出','证券卖出','证券卖出','证券卖出'],
...: '成交数量' : [500,1000,1500,2000,500,500,1000,1500],
...: '成交金额' : [-5000,-10000,-15000,-20000,5500,5500,11000,15000]
...: }
...:
In [3]: df = pd.DataFrame(data, index = ['2018-2-1','2018-2-1','2018-2-1','2018-2-1','2018-2-2','2018-2-2','2018-2-2','2018-2-3'])
In [4]: df
Out[4]:
成交数量 成交金额 摘要 证券名称
2018-2-1 500 -5000 证券买入 格力电器
2018-2-1 1000 -10000 证券买入 视觉中国
2018-2-1 1500 -15000 证券买入 成都银行
2018-2-1 2000 -20000 证券买入 中国联通
2018-2-2 500 5500 证券卖出 格力电器
2018-2-2 500 5500 证券卖出 视觉中国
2018-2-2 1000 11000 证券卖出 成都银行
2018-2-3 1500 15000 证券卖出 中国联通
删除具体列
In [5]: df.drop('成交数量',axis=1)
Out[5]:
成交金额 摘要 证券名称
2018-2-1 -5000 证券买入 格力电器
2018-2-1 -10000 证券买入 视觉中国
2018-2-1 -15000 证券买入 成都银行
2018-2-1 -20000 证券买入 中国联通
2018-2-2 5500 证券卖出 格力电器
2018-2-2 5500 证券卖出 视觉中国
2018-2-2 11000 证券卖出 成都银行
2018-2-3 15000 证券卖出 中国联通
删除具体行
In [6]: df.drop('2018-2-3')
Out[6]:
成交数量 成交金额 摘要 证券名称
2018-2-1 500 -5000 证券买入 格力电器
2018-2-1 1000 -10000 证券买入 视觉中国
2018-2-1 1500 -15000 证券买入 成都银行
2018-2-1 2000 -20000 证券买入 中国联通
2018-2-2 500 5500 证券卖出 格力电器
2018-2-2 500 5500 证券卖出 视觉中国
2018-2-2 1000 11000 证券卖出 成都银行
也可以根据行号删除记录,比如删除第三行
In [22]: df.drop(df.index[7])
Out[22]:
成交数量 成交金额 摘要 证券名称
2018-2-1 500 -5000 证券买入 格力电器
2018-2-1 1000 -10000 证券买入 视觉中国
2018-2-1 1500 -15000 证券买入 成都银行
2018-2-1 2000 -20000 证券买入 中国联通
2018-2-2 500 5500 证券卖出 格力电器
2018-2-2 500 5500 证券卖出 视觉中国
2018-2-2 1000 11000 证券卖出 成都银行
注意,这个办法其实不是按照行号删除,而是按照索引删除。如果index为3,则会将前4条记录都删除。这个方法支持一个范围,以及用负数表示从末尾删除。
删除特定数值的行(删除成交金额小于10000)
In [7]: df[ df['成交金额'] > 10000]
Out[7]:
成交数量 成交金额 摘要 证券名称
2018-2-2 1000 11000 证券卖出 成都银行
2018-2-3 1500 15000 证券卖出 中国联通
本例其实是筛选,如果需要保留,可以将筛选后的对象赋值给自己即可。
删除某列包含特殊字符的行
In [11]: df[ ~ df['证券名称'].str.contains('联通') ]
Out[11]:
成交数量 成交金额 摘要 证券名称
2018-2-1 500 -5000 证券买入 格力电器
2018-2-1 1000 -10000 证券买入 视觉中国
2018-2-1 1500 -15000 证券买入 成都银行
2018-2-2 500 5500 证券卖出 格力电器
2018-2-2 500 5500 证券卖出 视觉中国
2018-2-2 1000 11000 证券卖出 成都银行
如果想取包含某些字符的记录,可以去掉~
In [12]: df[ df['证券名称'].str.contains('联通') ]
Out[12]:
成交数量 成交金额 摘要 证券名称
2018-2-1 2000 -20000 证券买入 中国联通
2018-2-3 1500 15000 证券卖出 中国联通