Pandas包
一、两个基本数据结构
Series和DataFrame。其中Series的一维的,DateFrame是多维的。
二、与Numpy的不同
- Numpy数组中的数据类型是同质的;df中数据类型可以是不同的。
- df有索引的对象。index在pd中是一种数据类型。
三、基本属性
index:表示索引
columns:表示列名,其实也是一种索引对象。一般函数默认是按行索引,除非传入index=columns或者axis=1的参数
四、索引对象
- 在Series中,只有index索引。
- 在DF中,有index和columns两种索引。
- 索引是一种对象,可以在生成时显式地生成,也可以在生成后进行删除增加。但是数组的索引不可以更改。
- 索引对象可以通过obj.index和obj.columns进行访问
- 标签可以重复
五、Series介绍
介绍:单维数组型对象
1.查看索引和值
series_obj.index
series_obj.values
2.生成
a. 传入序列:pd.Series(序列,index=序列),可以指定index
b. 通过字典生成,这样index就是字典键,values是对应的键值
六、DataFrame
1.生成
a. 字典,pd.DataFrame(字典,columns=【可以指定列的顺序】)
b. 嵌套字典,即字典的键值还是字典,通过两个字典的键来确定索引
c. 2维数组
d. 多维列表
2.修改和增加
- 与字典的操作类似,通过df[索引]=数据来增加或者修改数据。
- 通过索引某一列或者某一行,使之等于某个标量或者向量来更改值。如果将Series类型的值赋值给了某一列,则会按照相同的索引来赋值。空缺的地方会使用缺失值补全。
3.删除
与字典的操作类似,del df[索引]
注意:从df种选取的列是视图,做修改也会改变原数据。
七、索引相关操作
1.重建索引
- df.reindex(新的索引序列),通过该方法改变数据的排列,如果数据中没有该索引会返回NA。
- 如果没有显式地说明index=,columns=,则该函数默认改变行索引
- 该方法可以用df.loc标签索引的方法进行替代,即df.loc[[新的行索引],新的列索引]
- 可以使用method参数和fill_value参数来进行缺失值的替换
2.删除索引
- del df[index]删除一列
- df.drop([索引])返回删除索引后的df
八、索引数据
1.标签索引
- df['a']
- df[['a','b']]
- df[['a':'b']] 注意使用标签时,两边都是闭区间。
2.切片和整数
df[2:4]选择行元素
df[列表]选择列元素
3.布尔值索引
df[series > 2]
4.loc和iloc函数
同时选择行标签和列标签的数据
- df.loc[行轴标签,列轴标签] 表示使用标签进行索引。其中行标签和列标签可以是值,列表,切片
- df.iloc[行整数索引,列整数索引],使用方法同上
注意:使用轴标签时是双闭区间。 - 如果iloc和loc只有一个参数传进去,默认是行索引
九、算术运算
1.对齐运算
- 两个df之间运算,按照索引对齐,对不齐的补NA值。
- 对不齐的也可以使用填充值参数
2.广播运算
df和series之间的运算
- 默认情况下,df和series间的数学操作会将series的index和df的列匹配,广播到各行。(即各行都进行这个运算,而不单单是一行)
- 也可以使用行匹配,列广播。可以使用算术方法如add\sub,传入参数axis='index'
十、统计方法
- df.sum() / mean() / cumsum()默认对行进行运算
- df.describe()函数对df或者series进行常见的统计变量的描述
- 协方差,df.corr()/cov() 默认是列与列之间的,传入axis='columns'进行行之间的
十一、排序
- df.sort_values(by=[排序的索引], ascending=False),可以按照单索引值排序,也可以按多个索引排序
- df.sort_index(),按照索引进行排序
- df.rank()函数对某字段进行排序,并返回排序的数组。其中的method参数和sql中的对应关系为:
method = 'first'按照值在表中出现的顺序排序,相当于sql中的row_number
method = 'min',如果有两个相同的值,则取较小的排名,排名值不连续,相当于rank();
method = 'dense',与min类似,但是区别在于排名值是连续的,相当于sql中的dense_rank(); - pd.cut(bins=int, labels=[]),将序列按照预设值分组,并给每组分配一个等级或者标签。当bins的值为整数时,分成相同长度的数组。
- pd.qcut(),与cut类似,但是按照分位数进行分割
十二、特殊函数
1.series.unique()返回Series中的唯一值,相当于sql中的distinct
2.series.value_counts()返回每个值出现的次数。
3.series.isin(序列)返回布尔值,表示series是否在序列中的布尔值。
4.series.str,通过Series的str属性,我们可以对文本进行操作,如去除文本中的某些符号,或利用正则表达式进行匹配。字符串的方法同Python内建字符串方法。
十三、分组聚合
- 使用df.groupby(by=[index])分组,其中index可以是多个索引也可以是单个索引
十四、多表关联
- 和数据库中的join用法类似。Pandas中有两种方法:
- 类方法,pd.merge(df1,df2)
- 实例方法,df1.merge(right=d2)
参数描述如下:
on:当两表中的合并键名相同时,可以用on
left_on:当两表中的合并键名不同时,左表的键名
right_on:与上述对应,右边的键名
how:how='inner';'left';'right';'outer'分别对应sql中的内连接、左连接、右连接和外连接;
df1=pd.DataFrame({'key':['a', 'b', 'c', 'd', 'a', 'b'], 'data1':range(6)})
df2=pd.DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})
print(df1)
print(df2)
--result
key data1
0 a 0
1 b 1
2 c 2
3 d 3
4 a 4
5 b 5
key data2
0 a 0
1 b 1
2 a 2
3 b 3
4 d 4
--合并
df1.merge(right=df2, on='key',how='inner')
--合并结果
key data1 data2
0 a 0 0
1 a 0 2
2 a 4 0
3 a 4 2
4 b 1 1
5 b 1 3
6 b 5 1
7 b 5 3
8 d 3 4
- 按照索引进行合并
和merge用法相似,但是按照index进行连接; - concat连接法
用法:pd.concat([df1, df2])
像sql中的union用法,即将两个表连接到一块,可以上下连接,也可以左右连接。
- 上下连接,默认上下连接。效果如图:
df1=pd.DataFrame(
{'A':list('abcde'),
'B':list('ghjik')}
)
df2=pd.DataFrame(
{'C':list('abcde'),
'D':list('ghjik')}
)
print(df1)
print(df2)
--result
A B
0 a g
1 b h
2 c j
3 d i
4 e k
C D
0 a g
1 b h
2 c j
3 d i
4 e k
pd.concat([df1,df2])
--result
A B C D
0 a g NaN NaN
1 b h NaN NaN
2 c j NaN NaN
3 d i NaN NaN
4 e k NaN NaN
0 NaN NaN a g
1 NaN NaN b h
2 NaN NaN c j
3 NaN NaN d i
4 NaN NaN e k
-左右连接,相当于join,按照索引进行连接
```python
pd.concat([df1,df2],axis=1)
--result
A B C D
0 a g a g
1 b h b h
2 c j c j
3 d i d i
4 e k e k
十五、去除空值和重复值
- fillna()使用指定的对象填充;
- dropna(),删除所有含有空值的行。若要删除列,则改变axis=1
- 查找重复值,df.duplicated() 返回一个布尔数组,如果该数据是在其它行也出现,则返回True。注,如果是查找df的重复,则两行数据完全相等才会返回True,因此一般判断某个字段。
十六、apply函数的用法
apply函数可以让我们自定义函数并运用于整个数组。
eg. 首先通过city字段进行聚合,再找出每个分组内按照positionId排序前两个的数据。
原表如图:
image.png
def fun(x):
x.sort_values(by=['positionId'],ascending=True)
return x[:2]
position.groupby(by=['city']).apply(fun)
进行聚类分组,结果如图
image.png
-
注意:pandas中还有一类函数,agg函数,其与apply函数用法类似,区别在于agg函数中只能使用聚合函数,即返回的值只有一行。
如图,只返回了聚合后的一行值。
image.png
十七、数据透视表
通过数据透视表,将数据按照多个维度进行聚类。
-
语法:df.pivot_table(index, columus, values, aggfunc,margins)
其中,index和columns分别表示行索引和列索引,values表示聚类的值,aggfunc表示自定义聚类函数,默认使用mean函数,margins表示是否进行求和,默认False,如果是True,则多出求和一栏
如原数据:
image.png
通过数据透视表,查看每个城市不同学历的平均公司编号(?数据源不对,仅为了练习)
position.pivot_table(index=['city','education'],columns='industryField',values='companyId')
返回的结果:
image.png
如果让不同的列使用不同的聚类函数,可以使用aggfunc自定义函数
,使用列表为每个values字段传入不同的函数,注意传入的函数是自定义形式