返回介绍

01. Python 工具

02. Python 基础

03. Numpy

04. Scipy

05. Python 进阶

06. Matplotlib

07. 使用其他语言进行扩展

08. 面向对象编程

09. Theano 基础

10. 有趣的第三方模块

11. 有用的工具

12. Pandas

二维数据结构:DataFrame

发布于 2022-09-03 20:46:15 字数 15754 浏览 0 评论 0 收藏 0

In [1]:

import numpy as np
import pandas as pd

DataFramepandas 中的二维数据结构,可以看成一个 Excel 中的工作表,或者一个 SQL 表,或者一个存储 Series 对象的字典。

DataFrame(data, index, columns) 中的 data 可以接受很多数据类型:

  • 一个存储一维数组,字典,列表或者 Series 的字典
  • 2-D 数组
  • 结构或者记录数组
  • 一个 Series
  • 另一个 DataFrame

index 用于指定行的 labelcolumns 用于指定列的 label,如果参数不传入,那么会按照传入的内容进行设定。

从 Series 字典中构造

可以使用值为 Series 的字典进行构造:

In [2]:

d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
     'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}

如果没有传入 columns 的值,那么 columns 的值默认为字典 keyindex 默认为所有 valueindex 的并集。

In [3]:

df = pd.DataFrame(d)

df

Out[3]:

onetwo
a11
b22
c33
dNaN4

如果指定了 index 值,index 为指定的 index 值:

In [4]:

pd.DataFrame(d, index=['d', 'b', 'a'])

Out[4]:

onetwo
dNaN4
b22
a11

如果指定了 columns 值,会去字典中寻找,找不到的值为 NaN

In [5]:

pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])

Out[5]:

twothree
d4NaN
b2NaN
a1NaN

查看 indexcolumns

In [6]:

df.index

Out[6]:

Index([u'a', u'b', u'c', u'd'], dtype='object')

In [7]:

df.columns

Out[7]:

Index([u'one', u'two'], dtype='object')

从 ndarray 或者 list 字典中构造

如果字典是 ndarray 或者 list,那么它们的长度要严格保持一致:

In [8]:

d = {'one' : [1., 2., 3., 4.],
     'two' : [4., 3., 2., 1.]}

index 默认为 range(n),其中 n 为数组长度:

In [9]:

pd.DataFrame(d)

Out[9]:

onetwo
014
123
232
341

如果传入 index 参数,那么它必须与数组等长:

In [10]:

pd.DataFrame(d, index=['a', 'b', 'c', 'd'])

Out[10]:

onetwo
a14
b23
c32
d41

从结构数组中构造

numpy 支持结构数组的构造:

In [11]:

data = np.zeros((2,), dtype=[('A', 'i4'),('B', 'f4'),('C', 'a10')])
data[:] = [(1,2.,'Hello'), (2,3.,"World")]

data

Out[11]:

array([(1, 2.0, 'Hello'), (2, 3.0, 'World')], 
      dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')])

参数处理的方式与数组字典类似:

In [12]:

pd.DataFrame(data)

Out[12]:

ABC
012Hello
123World

In [13]:

pd.DataFrame(data, index=['first', 'second'])

Out[13]:

ABC
first12Hello
second23World

In [14]:

pd.DataFrame(data, columns=['C', 'A', 'B'])

Out[14]:

CAB
0Hello12
1World23

从字典列表中构造

字典中同一个键的值会被合并到同一列:

In [15]:

data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]

pd.DataFrame(data2)

Out[15]:

abc
012NaN
151020

In [16]:

pd.DataFrame(data2, index=['first', 'second'])

Out[16]:

abc
first12NaN
second51020

In [17]:

pd.DataFrame(data2, columns=['a', 'b'])

Out[17]:

ab
012
1510

从 Series 中构造

相当于将 Series 二维化。

其他构造方法

DataFrame.from_dict 从现有的一个字典中构造,DataFrame.from_records 从现有的一个记录数组中构造:

In [18]:

pd.DataFrame.from_records(data, index='C')

Out[18]:

AB
C
---------
Hello12
World23

DataFrame.from_items 从字典的 item 对构造:

In [19]:

pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])])

Out[19]:

AB
014
125
236

列操作

DataFrame 可以类似于字典一样对列进行操作:

In [20]:

df["one"]

Out[20]:

a     1
b     2
c     3
d   NaN
Name: one, dtype: float64

添加新列:

In [21]:

df['three'] = df['one'] * df['two']

df['flag'] = df['one'] > 2

df

Out[21]:

onetwothreeflag
a111False
b224False
c339True
dNaN4NaNFalse

可以像字典一样删除:

In [22]:

del df["two"]

three = df.pop("three")

df

Out[22]:

oneflag
a1False
b2False
c3True
dNaNFalse

给一行赋单一值:

In [23]:

df['foo'] = 'bar'

df

Out[23]:

oneflagfoo
a1Falsebar
b2Falsebar
c3Truebar
dNaNFalsebar

如果 index 不一致,那么会只保留公共的部分:

In [24]:

df['one_trunc'] = df['one'][:2]

df

Out[24]:

oneflagfooone_trunc
a1Falsebar1
b2Falsebar2
c3TruebarNaN
dNaNFalsebarNaN

也可以直接插入一维数组,但是数组的长度必须与 index 一致。

默认新列插入位置在最后,也可以指定位置插入:

In [25]:

df.insert(1, 'bar', df['one'])

df

Out[25]:

onebarflagfooone_trunc
a11Falsebar1
b22Falsebar2
c33TruebarNaN
dNaNNaNFalsebarNaN

添加一个 test 新列:

In [28]:

df.assign(test=df["one"] + df["bar"])

Out[28]:

onebarflagfooone_trunctest
a11Falsebar12
b22Falsebar24
c33TruebarNaN6
dNaNNaNFalsebarNaNNaN

索引和选择

基本操作:

OperationSyntaxResult
Select columndf[col]Series
Select row by labeldf.loc[label]Series
Select row by integer locationdf.iloc[loc]Series
Slice rowsdf[5:10]DataFrame
Select rows by boolean vectordf[bool_vec]DataFrame

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文