Pandas两大主要数据结构之二——DataFrame

时间:2021-10-11
本文章向大家介绍Pandas两大主要数据结构之二——DataFrame,主要包括Pandas两大主要数据结构之二——DataFrame使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

DataFrame

上篇介绍了Series,本篇主要介绍DataFrame。

DataFrame是一个表格型数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。

DataFrame既有行索引,也有列索引。与其它类似的数据结构相比(如R的data.frame),DataFrame面向行和面向列的操作基本是平衡的。

DataFrame中的数据一般是以一个或者多个二维块存放的,而不是列表、字典或者其它一维数据结构。

创建DataFrame

In [12]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    ...:     ...: 'year': [2000, 2001, 2002, 2001, 2002],
    ...:     ...: 'pop': [1.5, 1.7, 3.6, 2.4, 3.9]}

In [13]: df = pd.DataFrame(data)

In [14]: df
Out[14]: 
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  3.9
  • 和Series一样,如果传入的列在数据中找不到的话,就会产生NA值
# 指定了列和行的顺序
In [15]: df2 = pd.DataFrame(data, columns=['pop', 'state', 'year', 'debt'], index=['one', 'two', 'three', 'four', 'five'])

# 因为传入的列不在字典中,因此结果中出现了缺失值
In [16]: df2
Out[16]: 
       pop   state  year debt
one    1.5    Ohio  2000  NaN
two    1.7    Ohio  2001  NaN
three  3.6    Ohio  2002  NaN
four   2.4  Nevada  2001  NaN
five   3.9  Nevada  2002  NaN

# 查看df2的列名
In [17]: df2.columns
Out[17]: Index(['pop', 'state', 'year', 'debt'], dtype='object')

DataFrame的列访问与处理

  • 获取DataFrame列的两种方式:字典标记形式、属性形式
In [18]: df2.state
Out[18]: 
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
Name: state, dtype: object

# 索引处使用列表的话,可以索引多列
In [19]: df2['state']
Out[19]: 
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
Name: state, dtype: object
  • 通过赋值(一个值或一组值)的方式进行修改
# 属性访问
In [20]: df2.debt = 16.5

In [21]: df2
Out[21]: 
       pop   state  year  debt
one    1.5    Ohio  2000  16.5
two    1.7    Ohio  2001  16.5
three  3.6    Ohio  2002  16.5
four   2.4  Nevada  2001  16.5
five   3.9  Nevada  2002  16.5
# 字典型标记访问
In [22]: df2['debt'] = np.arange(5.)

In [23]: df2
Out[23]: 
       pop   state  year  debt
one    1.5    Ohio  2000   0.0
two    1.7    Ohio  2001   1.0
three  3.6    Ohio  2002   2.0
four   2.4  Nevada  2001   3.0
five   3.9  Nevada  2002   4.0
  • 将列表或者数组赋值给某一列时,其长度必须与DataFrame相匹配。如果赋值的是Series,就会精确匹配DataFrame的索引,所有空位都会补上缺失值。
In [24]: val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])

In [25]: df2.debt = val

In [26]: df2
Out[26]: 
       pop   state  year  debt
one    1.5    Ohio  2000   NaN
two    1.7    Ohio  2001  -1.2
three  3.6    Ohio  2002   NaN
four   2.4  Nevada  2001  -1.5
five   3.9  Nevada  2002  -1.7
  • 为不存在的列赋值会创建新列。
In [27]: df2['eastern'] = df2.state == 'Ohio'

In [28]: df2
Out[28]: 
       pop   state  year  debt  eastern
one    1.5    Ohio  2000   NaN     True
two    1.7    Ohio  2001  -1.2     True
three  3.6    Ohio  2002   NaN     True
four   2.4  Nevada  2001  -1.5    False
five   3.9  Nevada  2002  -1.7    False
  • del关键字:删除某列,可以像在字典中那样删除DataFrame的某一列
In [29]: del df2['eastern']

In [30]: df2
Out[30]: 
       pop   state  year  debt
one    1.5    Ohio  2000   NaN
two    1.7    Ohio  2001  -1.2
three  3.6    Ohio  2002   NaN
four   2.4  Nevada  2001  -1.5
five   3.9  Nevada  2002  -1.7

DataFrame.drop方法

df.drop()方法。根据传参删除指定索引值,并产生新的索引

DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
  • 参数含义:

    • labels:要删除的行或列,用列表给出

    • axis:默认为 0,指要删除的是行,删除列时需指定 axis 为 1

    • index :直接指定要删除的行,删除多行可以使用列表作为参数

    • columns:直接指定要删除的列,删除多列可以使用列表作为参数

    • inplace: 默认为 False,该删除操作不改变原数据;inplace = True 时,改变原数据

    • 通过索引方式返回的列只是数据的视图,并不是副本。因此对返回的Series所做的任何就地修改都会直接作用到源DataFrame上。通过Series的copy方法,可以显式的复制列。

      这个地方极其容易出现SettingwithCopyWarning警告,具体的原因及解决办法参考:Pandas 中 SettingwithCopyWarning 的原理和解决方案

  • Series删除指定标记值

In [31]: obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])

In [32]: obj
Out[32]: 
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64
  
In [33]: new_obj = obj.drop('c')

In [34]: new_obj
Out[34]: 
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64
  • DataFrame删除指定条目。使用axis来确定行、列
In [35]: data = pd.DataFrame(np.arange(16).reshape((4, 4)), index=['Ohio', 'Colorado', 'Utah', 'New 
    ...: york'], columns=['one', 'two', 'three', 'four'])

In [36]: data
Out[36]: 
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
Utah        8    9     10    11
New york   12   13     14    15
# axis默认为0,选择行
In [37]: data.drop(['Colorado', 'Ohio'])
Out[37]: 
          one  two  three  four
Utah        8    9     10    11
New york   12   13     14    15
# axis=1或者axis='columns',选择列
In [38]: data.drop('two', axis=1)
Out[38]: 
          one  three  four
Ohio        0      2     3
Colorado    4      6     7
Utah        8     10    11
New york   12     14    15

In [39]: data.drop('two', axis='columns')
Out[39]: 
          one  three  four
Ohio        0      2     3
Colorado    4      6     7
Utah        8     10    11
New york   12     14    15
  • 使用inplace=True,直接修改原对象
In [40]: obj.drop('c', inplace=True)

In [41]: obj
Out[41]: 
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64

和drop方法一样,还有一些其他的索引对象的方法和属性。

方法 描述
append 将额外的索引对象粘贴到原索引后,产生一个新的索引
difference 计算两个索引的差集
intersection 计算两个索引的交集
union 计算两个索引的并集
isin 计算表示每一个值是否在传值容器中的不二数组
delete 将位置i的元素删除,并产生新的索引
drop 根据传参删除指定索引值,并产生新的索引值
insert 在位置i插入元素,并产生新的索引
is_monotonic 如果索引序列递增则返回True
is_unique 如果索引序列唯一则返回True
unique 计算索引的唯一值序列

DataFrame的行访问与处理

  • 行选择语法[:]
# 不包括选择范围末尾的2
In [48]: data[:2]
Out[48]: 
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
  • 行上的特殊索引符号loc(轴标签)和iloc(整数标签)
# 轴标签
In [59]: data.loc['Ohio', ['one', 'three']]
Out[59]: 
one      0
three    2
Name: Ohio, dtype: int64

# 整数标签
In [60]: data.iloc[0, [0, 2]]
Out[60]: 
one      0
three    2
Name: Ohio, dtype: int64
    
In [61]: data.iloc[[1, 2], [2, 0, 1]]
Out[61]: 
          three  one  two
Colorado      6    4    5
Utah         10    8    9

要时刻记得loc是用于标签的,如果轴索引包含整数,那么一定要使用标签索引。

In [62]: ser = pd.Series(np.arange(3.))

In [63]: ser
Out[63]: 
0    0.0
1    1.0
2    2.0
dtype: float64

In [64]: ser.loc[:1]
Out[64]: 
0    0.0
1    1.0    # loc中的1为整数索引1,所以选择到了这一项
dtype: float64

In [65]: ser.iloc[:1]
Out[65]: 
0    0.0    # iloc中的1为截止位置,所以只能选择到这一项
dtype: float64
时来天地皆同力,运去英雄不自由。

原文地址:https://www.cnblogs.com/tangzz/p/15345159.html