pandas数据结构之DataFrame

栏目: 数据库 · 发布时间: 5年前

内容简介:DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。下面记录DataFrame的常见使用,引入pandas约定:创建一个DataFrame最常见的方法是传入一个等长的列表或者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()
<class 'pandas.core.frame.DataFrame'>
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-enviorament\anaconda\Scripts\ipython: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-enviorament\anaconda\Scripts\ipython: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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

产品故事地图

产品故事地图

唐娜·理查(Donna Lichaw) / 向振东 / 机械工业出版社 / 2017-6 / 49.9元

本书一共8章,分为三个部分:第1-2章讲述故事的作用、你该如何运用产品故事来吸引顾客,不是通过讲故事,而是创造故事。第3-5章阐述了不同情境和客户生命周期中的产品故事类型。第6-8章进一步研究如何在战略和策略层面发现、提升、用好你的产品故事。 《产品故事地图》写给那些想要通过创造出顾客喜欢用、经常用而且会推荐给别人用的产品来吸引客户的人。这里的“产品”包括网页、软件、APP、数字化或非数字化......一起来看看 《产品故事地图》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具