资讯专栏INFORMATION COLUMN

数据科学库pandas笔记1

caiyongji / 3917人阅读

摘要:上海本科年广州硕士年广州本科应届毕业生北京本科年北京本科年上海本科年广州硕士年广州本科应届毕业生当然,如果想看尾部的数据,可以用函数,它默认显示尾部的行,与相反。

数据结构之DataFrame

pandas中有两种数据结构Series和DataFrame,Series类似于Numpy中的一维数组,这里就不详细记录了。主要记录下DataFrame的常见使用。

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。

下面记录DataFrame的常见使用,引入pandas约定:

from pandas import Series,DataFrame
import pandas as pd
DataFrame基本操作

1. 创建一个DataFrame数据框

创建一个DataFrame最常见的方法是传入一个等长的列表或者Numpy数组组成的字典。

In [16]: d = {
    ...:     "name":["cat","dog","lion"],
    ...:     "age":[3,5,6],
    ...:     "sex":["male","female","male"]
    ...: }

In [17]: d
Out[17]:
{"name": ["cat", "dog", "lion"],
 "age": [3, 5, 6],
 "sex": ["male", "female", "male"]}

In [18]: df = pd.DataFrame(d)

In [19]: df
Out[19]:
   name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

2. 查看数据框的概述

In [20]: df.info()

RangeIndex: 3 entries, 0 to 2  # 三个索引,从0到2
Data columns (total 3 columns): # 字段信息
name    3 non-null object # 字符串类型
age     3 non-null int64 # 整型
sex     3 non-null object # 字符串类型
dtypes: int64(1), object(2) # 统计数据类型信息
memory usage: 152.0+ bytes # 占用内存大小

3. 切片和索引

3.1 基于列索引进行切片

In [24]: df.age
Out[24]:
0    3
1    5
2    6
Name: age, dtype: int64

In [25]: df["age"]
Out[25]:
0    3
1    5
2    6
Name: age, dtype: int64

In [26]: df[["age","name"]]
Out[26]:
   age  name
0    3   cat
1    5   dog
2    6  lion

3.2 基于行索引进行切片
基于行索引进行切片有多种方法,比如DataFrame里的ix函数,loc函数和iloc函数等。

In [27]: df.ix[0]
D:work-envioramentanacondaScriptsipython:1: DeprecationWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
Out[27]:
name     cat
age        3
sex     male
Name: 0, dtype: object

使用ix函数可以进行行索引的切片,但是pandas建议使用loc或者iloc。

In [28]: df.ix[0:1]
D:work-envioramentanacondaScriptsipython:1: DeprecationWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
Out[28]:
  name  age     sex
0  cat    3    male
1  dog    5  female

In [29]: df[0:1] # 类似列表的切片操作
Out[29]:
  name  age   sex
0  cat    3  male

In [30]: df[0:2]
Out[30]:
  name  age     sex
0  cat    3    male
1  dog    5  female

同样,也可以使用类似列表切片的操作进行行索引切片,不过ix函数的这种操作会包括右边的索引,切的范围不同。

对于切出来的数据,数据类型还是数据框的,可以继续切片(多重切片)。

In [36]: df[0:2]["name"]
Out[36]:
0    cat
1    dog
Name: name, dtype: object

4. 选取和修改值

In [37]: df
Out[37]:
   name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

In [38]: df["age"]
Out[38]:
0    3
1    5
2    6
Name: age, dtype: int64

In [39]: df["age"] = 10 # 基于整列的值都修改为10

In [40]: df
Out[40]:
   name  age     sex
0   cat   10    male
1   dog   10  female
2  lion   10    male

In [41]: df["age"][0] = 20 # 修改age列的第一行的值为20

In [42]: df
Out[42]:
   name  age     sex
0   cat   20    male
1   dog   10  female
2  lion   10    male

In [43]: df.age = [3,4,5] # 为多个字段赋值可以传入一个列表

In [44]: df
Out[44]:
   name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

5. 数据的筛选
某些情况下,需要根据一些数据进行筛选,比如筛选出年龄大于5岁的人或者居住地区为广州的人等等。

In [44]: df
Out[44]:
   name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

In [46]: df.age == 4 # 逻辑判断,年龄等于4的,返回一个Series的布尔型数组
Out[46]:
0    False
1     True
2    False
Name: age, dtype: bool

In [47]: df[df.age == 4] # 根据这个布尔型数组进行索引,返回为True的
Out[47]:
  name  age     sex
1  dog    4  female

In [48]: df[[False,True,False]] # 这种与上面方法是等价的
Out[48]:
  name  age     sex
1  dog    4  female

In [51]: df.age > 3 # 大于小于也是可以的
Out[51]:
0    False
1     True
2     True
Name: age, dtype: bool

这里也有个小技巧就是,在这些逻辑判断操作的前面加上~号,就可以反转结果,如下:

In [54]: df.age == 3
Out[54]:
0     True
1    False
2    False
Name: age, dtype: bool

In [55]: ~(df.age == 3)
Out[55]:
0    False
1     True
2     True
Name: age, dtype: bool

同时也支持多重筛选

In [57]: df
Out[57]:
   name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

In [58]: (df.age == 3) & (df.name == "cat")
Out[58]:
0     True
1    False
2    False
dtype: bool

In [59]: df[(df.age == 3) & (df.name == "cat")]
Out[59]:
  name  age   sex
0  cat    3  male

pandas的query函数也可以达到筛选功能

In [66]: df.query("age == 3")
Out[66]:
  name  age   sex
0  cat    3  male

In [67]: df.query("(age == 3)&(sex=="male")")
Out[67]:
  name  age   sex
0  cat    3  male

6. 使用loc与iloc

对于DataFrame的行的标签索引,引入了特殊的标签运算符loc和iloc。它们可以让你用类似NumPy的标记,使用轴标签(loc)或整数索引(iloc),从DataFrame选择行和列的子集。

In [73]: df
Out[73]:
   name  age     sex
0   cat    3    male
1   dog    4  female
2  lion    5    male

In [74]: df.iloc[1] # 根据行标签进行索引,选取行索引为1的行
Out[74]:
name       dog
age          4
sex     female
Name: 1, dtype: object

In [75]: df.iloc[0:2] 
Out[75]:
  name  age     sex
0  cat    3    male
1  dog    4  female

如果行标签不是整数,而是字符串,那么就可以使用loc了。

In [76]: df.index = list("abc") # 将行索引改为abc

In [77]: df
Out[77]:
   name  age     sex
a   cat    3    male
b   dog    4  female
c  lion    5    male

In [78]: df.loc["a"] # 选取行索引为a的行
Out[78]:
name     cat
age        3
sex     male
Name: a, dtype: object

In [79]: df.loc[["a","b"]]
Out[79]:
  name  age     sex
a  cat    3    male
b  dog    4  female

In [80]: df.iloc[0] # 同样也可以使用iloc
Out[80]:
name     cat
age        3
sex     male
Name: a, dtype: object

iloc是根据具体的行的位置进行索引的,也就不管行标签是整数还是字符串类型,而loc是根据行标签进行索引的。
loc和iloc还有支持多个参数进行索引

In [83]: df
Out[83]:
   name  age     sex
a   cat    3    male
b   dog    4  female
c  lion    5    male

In [84]: df.iloc[0:2] # 选取第一行和第二行
Out[84]:
  name  age     sex
a  cat    3    male
b  dog    4  female

In [85]: df.iloc[0:2,1] # 选取列,列索引从0开始,所以选取第二列的数据
Out[85]:
a    3
b    4
Name: age, dtype: int64

In [86]: df.iloc[0:2,[0,1]] # 选取多列
Out[86]:
  name  age
a  cat    3
b  dog    4

7. 丢弃DataFrame的行或者列
丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象:

对于DataFrame,可以删除任意轴上的索引值。用标签序列调用drop会从行标签(axis 0)删除值:

In [153]: dd
Out[153]:
   name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

In [154]: dd.drop([1,2])
Out[154]:
  name  age   sex
0  cat    3  male

通过传递axis=1或axis="columns"可以删除列的值:

In [156]: dd
Out[156]:
   name  age     sex
0   cat    3    male
1   dog    5  female
2  lion    6    male

In [157]: dd.drop("sex",axis=1)
Out[157]:
   name  age
0   cat    3
1   dog    5
2  lion    6

In [158]: dd.drop("sex",axis="columns")
Out[158]:
   name  age
0   cat    3
1   dog    5
2  lion    6

8. DataFrame行,列的添加
以下面数据框为例:

In [182]: dd
Out[182]:
  name  age
0  cat    2
1  dog    3

以字典方式添加一行,忽略索引:

In [190]: row = {"name":"lion","age":4}

In [191]: dd.append(row,ignore_index=True)
Out[191]:
   name  age
0   cat    2
1   dog    3
2  lion    4

使用loc,添加一行或者修改已存在行的内容:

In [206]: dd
Out[206]:
  name  age
0  cat    2
1  dog    3

In [207]: dd.loc[4] = ["lion","4"]

In [208]: dd
Out[208]:
   name age
0   cat   2
1   dog   3
4  lion   4

In [209]: dd.loc[1] = ["dog",5]

In [210]: dd
Out[210]:
   name age
0   cat   2
1   dog   5
4  lion   4



数据分析中的常见使用

首先是数据的加载,pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,常用的有read_csvread_table
以read_csv为例:

In [97]: df = pd.read_csv("dataAnalyst_gbk.csv",encoding="gbk")

In [98]: df
Out[98]:
  city education  top   avg work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生
3   北京        本科   13  12.0        2年
4   北京        本科   11   8.0        1年

read_csv函数默认是以utf-8格式进行文件的加载,而这个dataAnalyst_gbk.csv文件是gbk格式的,所以需要enconding指定文件格式以解码。如上代码所示,read_csv函数将表格型数据加载为DataFrame对象。

csv文件默认是以逗号为分隔符,如果想指定分隔符,可以使用sep参数,比如下面读取test.csv文件,并且以t为分隔符。

df = pd.read_csv("test.csv",sep="	")

如果想对读取文件的字段名,也就是第一行的列名进行更改,可以在读取文件的时候使用names参数

In [111]: df = pd.read_csv("dataAnalyst_gbk.csv",encoding="gbk",names=["a","b","c","d","e"])

In [112]: df # 可以看到列标签变成了abcde
Out[112]:
      a          b    c    d          e
0  city  education  top  avg  work_year
1    上海         本科    9  8.0         3年
2    广州         硕士   15   11         2年
3    广州         本科   12   10      应届毕业生
4    北京         本科   13   12         2年
5    北京         本科   11    8         1年

在获取数据后,便可以对数据进行进一步的分析,清洗等操作,下面记录一些常见的使用。

1. head()函数,默认显示前5行

对于一些非常庞大的数据框,使用head()可以简要的查看数据,head默认显示前5行,可以传递数字让pandas显示多少行。

In [116]: df.head()
Out[116]:
  city       education  top   avg work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生
3   北京        本科   13  12.0        2年
4   北京        本科   11   8.0        1年

In [117]: df.head(3)
Out[117]:
   city     education  top avg    work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生

当然,如果想看尾部的数据,可以用tail函数,它默认显示尾部的5行,与head相反。

2. 更改数据类型
使用df.info()函数可以看到各个列的数据类型,实际分析中也有需求去更改它的数据类型

In [120]: df.info()

RangeIndex: 5 entries, 0 to 4
Data columns (total 5 columns):
city         5 non-null object
education    5 non-null object
top          5 non-null int64
avg          5 non-null float64
work_year    5 non-null object
dtypes: float64(1), int64(1), object(3)
memory usage: 280.0+ bytes

pandas提供了astyp()函数进行数据类型的更改,例如下面将top列的值的数据类型更换为字符串类型。

In [122]: df.top
Out[122]:
0     9
1    15
2    12
3    13
4    11
Name: top, dtype: int64 # 默认是int64

In [123]: df.top.astype("str")
Out[123]:
0     9
1    15
2    12
3    13
4    11
Name: top, dtype: object # 已经更改为字符串类型


需要注意的是df.top.astype("str")并不会去修改原先数据框的数据类型,而是新建了一个,如果想对原先的数据框进行修改,需要进行赋值操作df.top = df.top.astype("str")

In [124]: df.top = df.top.astype("str") 

In [125]: df.top
Out[125]:
0     9
1    15
2    12
3    13
4    11
Name: top, dtype: object

3. 进行一些简单的数值计算以及筛选过滤

In [129]: df
Out[129]:
  city education  top   avg work_year
0   上海        本科    9   8.0        3年
1   广州        硕士   15  11.0        2年
2   广州        本科   12  10.0     应届毕业生
3   北京        本科   13  12.0        2年
4   北京        本科   11   8.0        1年

In [130]: df["avg_2"] = df.avg*2 # 增加新的一列,数据为avg数值的两倍

In [131]: df 
Out[131]:
  city education  top   avg work_year  avg_2
0   上海        本科    9   8.0        3年   16.0
1   广州        硕士   15  11.0        2年   22.0
2   广州        本科   12  10.0     应届毕业生   20.0
3   北京        本科   13  12.0        2年   24.0
4   北京        本科   11   8.0        1年   16.0

找出平均薪资大于10K的数据或者平均薪资大于10K的城市:

In [133]: df.query("avg>10")
Out[133]:
  city education  top   avg work_year  avg_2
1   广州        硕士   15  11.0        2年   22.0
3   北京        本科   13  12.0        2年   24.0

In [134]: df.query("avg>10").city
Out[134]:
1    广州
3    北京
Name: city, dtype: object

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43702.html

相关文章

  • 15个Python,让你学习数据科学更轻松

    摘要:在本节中,我们将看到一些最流行和最常用的库,用于机器学习和深度学习是用于数据挖掘,分析和机器学习的最流行的库。愿码提示网址是一个基于的框架,用于使用多个或进行有效的机器学习和深度学习。 showImg(https://segmentfault.com/img/remote/1460000018961827?w=999&h=562); 来源 | 愿码(ChainDesk.CN)内容编辑...

    W4n9Hu1 评论0 收藏0
  • 8步从Python白板到专家,从基础到深度学习

    摘要:去吧,参加一个在上正在举办的实时比赛吧试试你所学到的全部知识微软雅黑深度学习终于看到这个,兴奋吧现在,你已经学到了绝大多数关于机器学习的技术,是时候试试深度学习了。微软雅黑对于深度学习,我也是个新手,就请把这些建议当作参考吧。 如果你想做一个数据科学家,或者作为一个数据科学家你想扩展自己的工具和知识库,那么,你来对地方了。这篇文章的目的,是给刚开始使用Python进行数据分析的人,指明一条全...

    Zachary 评论0 收藏0
  • Python数据分析实用程序

    摘要:机器学习由于数据量较大,技术已成为必要。以下脚本演示了世界银行数据的线性回归实用程序和缓存下载程序省略了水印和绘图标签的代码代码应显示以下图像该计划下载年世界银行数据,并将婴儿死亡率与人均进行对比。 showImg(https://segmentfault.com/img/remote/1460000019179713); 来源 | 愿码(ChainDesk.CN)内容编辑 愿码Sl...

    mozillazg 评论0 收藏0
  • ApacheCN 学习资源汇总 2019.3

    摘要:主页暂时下线社区暂时下线知识库自媒体平台微博知乎简书博客园合作侵权,请联系请抄送一份到特色项目中文文档和教程与机器学习实用指南人工智能机器学习数据科学比赛系列项目实战教程文档代码视频数据科学比赛收集平台,,剑指,经典算法实现系列课本课本描述 【主页】 apachecn.org 【Github】@ApacheCN 暂时下线: 社区 暂时下线: cwiki 知识库 自媒体平台 ...

    array_huang 评论0 收藏0
  • ApacheCN 学习资源汇总 2019.3

    摘要:主页暂时下线社区暂时下线知识库自媒体平台微博知乎简书博客园合作侵权,请联系请抄送一份到特色项目中文文档和教程与机器学习实用指南人工智能机器学习数据科学比赛系列项目实战教程文档代码视频数据科学比赛收集平台,,剑指,经典算法实现系列课本课本描述 【主页】 apachecn.org 【Github】@ApacheCN 暂时下线: 社区 暂时下线: cwiki 知识库 自媒体平台 ...

    Prasanta 评论0 收藏0

发表评论

0条评论

caiyongji

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<