Pandas

Pandas

Series(适用于一维的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Series数据的建立
pddata_1=pd.Series([1,2,3])
对应数据格式:
0 1
1 2
2 3
pddata_1=pd.Series([[1,2],[3,4]])
对应数据格式:
0 [1, 2]
1 [3, 4]
pddata_1=pd.Series([[1,2],[3,4]],index=['345','2342'])
对应数据格式:
345 [1, 2]
2342 [3, 4]
pddata_1=pd.Series(((1,2),(3,4)),index=['345','2342'])
对应数据格式:
345 (1, 2)
2342 (3, 4)
pddata_1=pd.Series([np.random.randint(1,100,6),np.random.randint(1,100,6)])
对应数据格式:
0 [15, 24, 43, 57, 97, 36]
1 [67, 12, 69, 61, 9, 18]
pddata_1=pd.Series({1:'foo',3:'drt',8:'tyue'}) =====不需要加索引index否则会使得数据的值变成nan,冲突了
对应数据格式:
1 foo
3 drt
8 tyue
pddata_1=pd.Series(list(zip(np.array(list1),np.array(list2)))
对应数据格式:
0 (1, 3)
1 (2, 4)
2 (3, 5)
3 (4, 6)

Series常用的方法

1
2
3
4
5
s1.values  以数组形式查看所有值
s1.index 查看所有索引
通过索引取值 s1['索引名']
Series过滤 s1[s1>2] 返回索引以及对应的数据
(numpy过滤的实现通过布尔数组实现)
Series更新

s1.update(pd.Series([12,23],index = [3,4]))

Series追加

s1.append(pd.Series([-123,-234,-56],ignore_index=True)) ignore_index=True表示形成默认的索引,不写表示使用原来数据自带的索引

Series是否包含某个数据

‘want’ in datas_pys 返回布尔值.判断want是否为datas_pys的索引,数据框dataframe同样适用index和columns都可以判断

检测数据是否丢失

pd.isnull(serie_123) serie_123.isnull() 是空值的返回对应的True
pd.notnull(serie_123) serie_123.notnull() 不是空值对应的布尔值为True
补充:numpy判断是否为空,np.isnan(i) == True,没有i == np.nan这种用法

1
2
3
4
np.random.seed() 随机种子,使得随机组成的数组不会改变,重新运行还是之前的三个数据
a1 = np.random.randint(1,13,6)
np.random.seed()
a1
修改Series的索引

s1.index = [新的值]
serie_123.index=[‘lin’, ‘tan’, ‘shan’, ‘zhang’]

Series索引重建

sr1.reindex([1,2,3,4,’e’,’r’,’t’]) 新形成的索引若原来的sr1中有对应的索引则数据不变,对于sr1中没有的则显示为NaN

sr1.reindex([1,2,3,4,’e’,’r’,’t’],fill_value = -1) 没有的全部填成-1,具体填什么看要求可以为0等等

缺失值填充

s2=s1.reindex(range(11),method=’ffill’) 向前填充(6对应5的数据)

s2=s1.reindex(range(11),method=’bfill’) 向后填充(6对应7的数据

选区

Series的切片选区不仅可以通过自定义的索引去获取还能通过默认的数字去获取(即使已经自定义了同样可以使用) 注意右边可以取到是闭区间(仅适用自定义的索引)

布尔索引

sr1[sr1>5] =====返回符合条件的数据以及对应的行索引

Series赋值

sr1[2:4] = [2,3] ======自定义的索引也可以使用切片操作

value_counts()

对Series中值进行计数 返回的为值以及对应的数量
pd.value_counts(series_3.values) 当成函数同样可以使用,当成函数可以用在任何序列和数组,一般不用于数据框

isin()

判断数据是否在容器内返回布尔数组
s1.isin([‘a’,’c’]) 每个数据都进行判断,可以当做布尔索引使用返回true的索引和值

DataFrame

创建数据框
方式一:

df1 = pd.DataFrame(np.random.randint(1,100,(3,3)),index=[‘a’,’b’,’c’],columns=[‘d’,’e’,’f’]) 不使用index和columns时会使用默认的0,1,2…之类的

方式二:

list1 = [1,3,4,5,6]
list2 = [5,6,7,8,9]
dict1 = {‘a’:list1,’b’:list2}
df1 = pd.DataFrame(dict1) =====行索引使用的是默认的数字,列索引使用的是字典的键

索引的使用
获取数据

df1.loc[行索引名,列索引名] ix很少使用,基本用到行索引都要用loc

loc不能直接获取某一列可以通过df1.loc[:,列索引名] ,列索引名可以为列表任意选取指定的列,行同样可以

但是行索引可以通过切片获取 如df1[‘t’:’t’]可以获取指定的行和多行
列数据索引

df1[‘列索引名’] =====返回对应的那一列以及对应的行索引

行数据索引

df1.loc[行索引名] 或者 df1.ix[行索引名] (快要不能使用了少用)

索引的更改

df1.index = [新值] df1.columns= [新值]

转置

df1.transpose() 或者 df1.T

删除列索引以及对应列

del df1[‘e’] ======该方法无法删除行索引添加loc也不行

删除行索引以及对应行(也可以用来删除列)

df1.drop(行索引名) 默认0轴表示行,1表示列========删除相关的0,1跟记得不太一样逐行按列和按列逐行相反注意差别

数据框名字的添加(列索引行索引的统称,跟二维数组那种类似)

df1.index.name = ‘名字’
df1.columns.name = ‘名字

替换数据

a1.replace([np.nan, 5, 7], [10, 100, 100])

查看数据框的索引

df1.index

产看数据框的值

df1.values ====返回的是数组

缺失值填充

同Series相同 df1.reindex([1,’t’,’tr’,’e’]) 有的写下来没有的全为NaN

修改索引

修改行索引(默认为行索引) df1.reindex(index = [1,’t’,’tr’,’e’])

修改列索引 frame2.reindex(columns=[‘four’,’three’])

同时修改列和行索引 df1.reindex([‘row1’,’row2’,’row3’,’row4’],columns=[‘five’,’three’,’six’])

布尔索引

df1[df1[列索引名]>60] =====返回对应True的行

df1.loc[df1[列索引名]>60,:] 与上面的等价

df1[df1>60] 只返回True对应的值False的值为NaN

行列索引有重复值

通过行列索引获取会将多个都获取到df1.loc[‘r1’] df1[‘d2’]

is_unique()

判断是否存在重复值索引 df.index.is_unique() df.columns.is_unique

series 使用s1.is_unique()即可

Get_value

方法得到数据框内单个值==效果同loc但是不常用

Data.get_value(‘three’,’ihr’)

简单的算数运算和数据对齐

Series按照对应的索引相加减乘除如果没有对应的返回NaN,推荐使用默认索引

DataFrame也要按照行列索引相同相加减乘除,否则会产生NaN

消除空值的方法

df1.add(df2,fill_value=0)

DataFrame 和 Series之间运算(索引要一一对应)

df1-sr1 =====匹配列索引,数据框一行行被Series减去(广播)

一列列相减没意义,实现需要通过方法如f1.sub(s1,axis=0)

min()\max()

默认按列计算==df1.min(0) 按行算改成1即可

sum()

df1.sum() 按列求和 df1.sum(0)
df1.sum(1) 按行求和
df1.sum(axis=1,skipna=False) 不跳过空值,有空值则结果为NaN

idxmax()\idxmin()

df1.idxmax() 按列求最大值所在的行索引 == df1.idxmax(0)
df1.idxmax(1) 按行球最大值所在的列索引 返回列索引以及对应的行索引
df1.idxmin() 方法同上面的max
df1.idxmin(axis=1,skipna=False) 遇到了nan则对应为NaN

cumsum()

求累加和,默认按列,默认忽略空值
df1.cumsum() 同 df1.cumsum(0)
df1.cumsum(1) 按行求累加和

describe()

df1.describe()查看df1列的众多属性

fillna()

df1.fillna(0) 将所有的空值填为0,其中np.nan和None都能产生空值的效果
df1.fillna({1:5,2:4}) 通过字典补值 将列索引1和2那列所有空值填成5和4
df1.fillna({1:pd.Series([2,3,7],index=[0,1,2]),2:pd.Series([1,9],index=[0,1])}) 通过观察原数据的空值,确定行号,然后根据空缺值所在的位置创建Series对对应数据进行补值(常用语经验补值和业务补值)

dropna()

过滤空值数据
s1.dropna() 删除空值及其对应的索引
df1.dropna(0,how=’any’) 按行删除,将行中有空值的全删除
df1.dropna(1,how=’all’) 按列删除,将列中全为空值的删除否则不删

apply和applymap(通过函数对数据处理)

df1.apply(func,axis=1) 根据func是矢量还是标量决定是否对元素操作(这里的矢量指函数含有min,max等方法) 当为标量的时候是对每一个元素处理,当为矢量决定是对行还是列处理

df1.applymap(func) 对每一个数据处理

DataFrame 的格式化(非常有用)
1
2
3
frame11=pd.DataFrame(np.random.randn(3,4),index=['r1','r2','r3'],columns=['c1','c2','c3','c4'])
formatierung=lambda x:'%.2f' % x
frame11.applymap(formatierung)
排序和排名
索引排序

df1.sort_index(0) 逐行按列

df1.sort_index(1) 逐列按行

值排序

df1.sort_values(by=某个列字段,axis=0) 按列排

df1.sort_values(by=某个行字段,axis=1) 按行排

===================================================

Series排名

方法1:Series_1.rank(method=’average’,ascending=True)
方法2:Series_1.rank(method=’min’)
方法3:Series_1.rank(method=’max’)
方法4:Series_1.rank(method=’first’)
DataFrame的排名(默认是按列排的按行排加上axis=1)
方法1:Frame_1.rank(method=’average’,ascending=True)
方法2:Frame_1.rank(method=’min’)
方法3:Frame_1.rank(method=’max’)
方法4:Frame_1.rank(method=’first’)

花式索引随机赋空值(块赋值)

fr567.loc[np.unique(np.random.randint(3,8,5).tolist()),np.unique(np.random.randint(2,7,5).tolist())]=np.nan

层次化索引

pd.Series(np.random.randn(4),index=[[‘r1’,’r1’,’t1’,’t1’],[2,3,5,7]])

最里层索引一定唯一

散点知识点

1
2
3
4
5
in判断索引是否在Series或者DataFrame里而不是数据是否在里面
#时间加减操作
from dateutil.relativedelta import relativedelta
from datetime import datetime
datetime.now() - relativedelta(days=1)