Pandas包

作者: 风一样的我1 | 来源:发表于2021-04-17 18:42 被阅读0次
Pandas.png

一、两个基本数据结构

Series和DataFrame。其中Series的一维的,DateFrame是多维的。

二、与Numpy的不同

  1. Numpy数组中的数据类型是同质的;df中数据类型可以是不同的。
  2. 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可以是多个索引也可以是单个索引

十四、多表关联

  1. 和数据库中的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
  1. 按照索引进行合并
    和merge用法相似,但是按照index进行连接;
  2. 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

十五、去除空值和重复值

  1. fillna()使用指定的对象填充;
  2. dropna(),删除所有含有空值的行。若要删除列,则改变axis=1
  3. 查找重复值,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字段传入不同的函数,注意传入的函数是自定义形式

相关文章

网友评论

      本文标题:Pandas包

      本文链接:https://www.haomeiwen.com/subject/xyxplltx.html