美文网首页数据蛙数据分析每周作业
Pandas (二) :DataFrame数据结构

Pandas (二) :DataFrame数据结构

作者: 汤海怪 | 来源:发表于2019-02-17 15:33 被阅读2次

DataFrame

DataFrame是一种类似表格形式的二维数据结构,其数据是以行和列的表格方式排列的。
例如我们存储一个人的相关信息:

    age  name sex
0  22.0   Bob   F
1  21.0   Tom   F
2   NaN  Andy   M

上面就是一个简单的DataFrame,其中,name、age、sex分别为列标签,0、1、2分别为默认的行标签,创建的代码为:

lists = [{'name':'Bob','age':22,'sex':'F'},
        {'name':'Tom','age':21,'sex':'F'},
        {'name':'Andy','sex':'M'}]
df = pd.DataFrame(lists)
print(df)

上面的list存储着三个人的相关信息,每一项字典的key都是默认的列标签


创建

DataFrame可以通过pandas.DataFrame()函数创建

# data : 数据源,ndarray、series、map、lists、dict、常量或者另一个DataFrame
# index : 行标签,默认为np.arrange(n)
# columns : 列标签,默认为np.arrange(n)
# dtype : 指定数据类型,默认系统推断数据类型
# copy : 复制数据,默认为 Flase

pandas.DataFrame( data, index, columns, dtype, copy)

通过 lists 创建

a. 简单一维数组

# 创建一个字符串数组
lists = ['Bob','Tom','Andy']
# 传入数据
df = pd.DataFrame(lists)
print(df)
'''
      0
0   Bob
1   Tom
2  Andy'''

因为行标签index和columns都没有指定,因此使用了默认的np.arrange(n)

b. 二维数组

lists = [['Bob',25],['Tom',23],['Andy',19]]
# 传入数据,并指定列标签
df = pd.DataFrame(lists, columns=['name','age'])
print(df)
'''
   name  age
0   Bob   25
1   Tom   23
2  Andy   19'''

这时参数columns的数组长度要和lists中的元素数组长度一致

c. ndarray二维数组

lists = np.arange(12).reshape(3,4)
df = pd.DataFrame(lists)
print(df)
'''
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
'''

通过较低纬度的 Series 来创建

s = pd.Series(['Bob','Tom','Andy'], index=['first','second','third'])
df = pd.DataFrame(s, columns=['name'])
print(df)
'''
        name
first    Bob
second   Tom
third   Andy
'''

通过 list的字典

# 注:元素必须具有相同的长度
dic = {'name':['Bob','Tom','Andy'],'age':[25,23,19],'sex':['F','F','M']}
# 传入数据并指定行索引
df = pd.DataFrame(dic, index=['row{}'.format(i) for i in np.arange(len(dic['name']))])
print(df)
'''
      age  name sex
row0   25   Bob   F
row1   23   Tom   F
row2   19  Andy   M
'''

此外,字典中的值也可以是多种样式,但其中数组长度必须一致,常量填充最长长度

dic = {
    'A':pd.Series(1, index=range(4)),
    'B':26,
    'C':pd.Timestamp('20190217'),
    'D':np.arange(4)
}
df = pd.DataFrame(dic)
print(df)
'''
   A   B          C  D
0  1  26 2019-02-08  0
1  1  26 2019-02-08  1
2  1  26 2019-02-08  2
3  1  26 2019-02-08  3
'''

通过 字典列表

我们还可以通过字典列表来创建DataFrame,字典中的key会被视为列标签,所有字典中的唯一key都会成为列标签,没有则使用NaN值补齐

lists = [{'name':'Bob','age':25,'sex':'F'},
        {'name':'Tom','age':23,'sex':'F'},
        {'name':'Andy','sex':'M'}]
df = pd.DataFrame(lists)
print(df)
'''
    age  name sex
0  25.0   Bob   F
1  23.0   Tom   F
2   NaN  Andy   M
'''

也可以指定 列标签,若字典中缺少相关字段则默认填充 NaN, 标签数组决定了列是顺序

df = pd.DataFrame(lists, columns=['name','sex','age','height'])
print(df)
'''
   name sex   age  height
0   Bob   F  25.0     NaN
1   Tom   F  23.0     NaN
2  Andy   M   NaN     NaN
'''

也可以指定 行标签, 列标签也可以比字典中的少,虽然多的字段会被丢弃

df = pd.DataFrame(lists, index=['first','second','third'],columns=['name','sex'])
print(df)
'''
        name sex
first    Bob   F
second   Tom   F
third   Andy   M
'''

增删操作

例子数据

index = pd.date_range('20190217', periods=7)
columns = list('ABCD')
df = pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)
print(df)
'''
                   A         B         C         D
2019-02-08 -2.028688  0.439382 -1.939392 -0.876227
2019-02-09  1.322120  1.722774 -0.825087  0.830235
2019-02-10 -0.296324  2.465106  1.084785  0.983708
2019-02-11  0.277785  0.935043 -0.299506  0.514187
2019-02-12 -2.089254 -0.275968 -1.466165  0.322209
2019-02-13  0.205912 -1.642673 -0.628401 -0.053906
2019-02-14  2.615111  0.871448 -0.428041  0.857018
'''

添加 列

df['E'] = 1
print(df)
'''
                   A         B         C         D  E
2019-02-08 -2.360552  0.064194  0.455912  1.067189  1
2019-02-09  1.172144  1.110124 -2.108127 -1.551015  1
2019-02-10 -1.481258  0.518018  0.592958  0.024791  1
2019-02-11 -0.388603  1.556626  1.176389 -0.126905  1
2019-02-12  0.809137 -0.049594  0.057527  0.690147  1
2019-02-13 -0.742054 -0.075211 -0.823174  0.220592  1
2019-02-14 -0.990349 -1.191461  1.572127 -0.480145  1
'''

删除 列

df.pop('E') 
print(df)
'''
                   A         B         C         D
2019-02-08 -0.448693 -1.974794 -0.041380 -1.595393
2019-02-09  1.724595 -0.096974 -0.026345  0.984426
2019-02-10 -0.203396  0.107673  0.532353  0.119386
2019-02-11  0.528793  2.050661  0.854727 -2.008437
2019-02-12  1.941374 -0.777696 -1.143443 -0.744675
2019-02-13 -1.072986  0.522539  1.263841  0.324437
2019-02-14  0.072737 -1.201634 -0.229115 -0.289056
'''

注:不像python内置的pop函数,这里的pop中的item是必填的

添加 行

df2 = pd.DataFrame(2, index=pd.date_range('20190217',periods=1), columns=columns, dtype=float)
df = df.append(df2)
print(df)
'''
                   A         B         C         D
2019-02-08  1.501641  0.283082  0.498203 -0.962883
2019-02-09  0.300840  1.181264  1.048192  1.692875
2019-02-10 -0.151108 -0.938684 -1.097083  0.112622
2019-02-11  0.217315  0.601876 -0.063849  1.971134
2019-02-12  0.651812 -0.378796 -0.338030  0.337614
2019-02-13 -0.356199 -0.698849  2.245919  0.819013
2019-02-14 -0.852322 -0.499241 -1.497437  0.403296
2019-02-15  2.000000  2.000000  2.000000  2.000000
'''

我们给df数据中添加了一条数值为2的一行

那么如何删除 行 数据呢,下面我们介绍一下删除函数drop()

pandas.drop()

# albels:标签数组
# asxis:方向,1表示横向,0表示纵向
# index:要删除的行数组
# columns:要删除的列数组
drop(labels=None, axis=0, index=None, columns=None)

删除 列
a. 指定 列标签 columns

data = df.drop(columns=['A','D'])
print(data)
'''
                   B         C
2019-02-08  0.659580 -0.915754
2019-02-09  0.533189  0.770098
2019-02-10  0.612976 -1.550603
2019-02-11 -0.461758  0.123775
2019-02-12  0.284651  0.590690
2019-02-13  1.054701  0.148838
2019-02-14 -0.581583  1.651076
2019-02-15  2.000000  2.000000
'''

b. 标签名 + 方向

data = df.drop(['A','C'], axis=1)
print(data)
'''
                   B         D
2019-02-08  0.732953 -1.210247
2019-02-09 -0.808781  1.559428
2019-02-10 -0.889716  1.350781
2019-02-11  1.289531 -0.540922
2019-02-12  0.357992 -1.013138
2019-02-13  0.596719 -0.523584
2019-02-14  0.221423  0.690994
2019-02-15  2.000000  2.000000
'''

删除 行

a. 指定 行标签 index

data = df.drop(index=index[:3])
print(data)
'''
                   A         B         C         D
2019-02-11 -0.960596 -1.658962  0.027986 -0.126117
2019-02-12  1.207873  0.045211  1.860603  1.392873
2019-02-13  0.247632 -1.467985 -1.564298  0.994310
2019-02-14 -1.455130 -0.525645 -0.173436  0.825248
2019-02-15  2.000000  2.000000  2.000000  2.000000
'''

b. 标签名 + 方向

data = df.drop(index[:3],axis=0)
print(data)
'''
                   A         B         C         D
2019-02-11 -0.950032  2.295755 -0.045384 -0.369924
2019-02-12 -1.296856  0.083413 -0.518678 -0.683066
2019-02-13 -0.057576  0.574244 -0.194683 -0.778204
2019-02-14  0.824786 -0.083522  0.409716  1.212379
2019-02-15  2.000000  2.000000  2.000000  2.000000
'''

选择

例子数据

index = pd.date_range('20190217', periods=7)
columns = list('ABCD')
df = pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)

标签函数 .loc
loc可以通过 DataFrame 中的标签来选取数据,第一个位置为行标签,第二个位置为列标签

a. 使用 行标签

data = df.loc['20190217']
print(data)
'''
A    0.172456
B   -0.196708
C   -0.358772
D    0.813195
Name: 2019-02-11 00:00:00, dtype: float64'''

b. 使用 列标签

data = df.loc[:,'A':'D']
print(data)
'''
                   A         B         C         D
2019-02-11.172456 -0.196708 -0.358772  0.813195
2019-02-12  0.606509 -1.150471 -0.114394 -0.968890
2019-02-13 -0.223689  0.583463  0.862829  1.012615
2019-02-14  0.227347  0.643138  1.813924 -0.316260
2019-02-15  0.053666  0.388430 -0.174752 -0.711354
2019-02-16 -0.373851  0.811530 -0.602160 -0.775848
2019-02-17 -0.053576  0.986285  2.754268 -1.364663
'''

c. 行标签 + 列标签

data = df.loc['20190212':'20190213','B':]
print(data)
'''
                   B         C         D
2019-02-12 -0.196708 -0.358772  0.813195
2019-02-13 -1.150471 -0.114394 -0.968890
2019-02-14  0.583463  0.862829  1.012615
2019-02-15  0.643138  1.813924 -0.316260
'''

索引函数 .iloc
iloc是通过索引位置来选取数据的

a. 行索引

data = df.iloc[1:3]
print(data)
'''
                   A         B         C         D
2019-02-12  0.606509 -1.150471 -0.114394 -0.968890
2019-02-13 -0.223689  0.583463  0.862829  1.012615
'''

b. 列索引

data = df.iloc[:,[2,3]]
print(data)
'''
                   C         D
2019-02-11 -0.358772  0.813195
2019-02-12 -0.114394 -0.968890
2019-02-13  0.862829  1.012615
2019-02-14  1.813924 -0.316260
2019-02-15 -0.174752 -0.711354
2019-02-16 -0.602160 -0.775848
2019-02-17  2.754268 -1.364663
'''

c. 行索引 + 列索引

data = df.iloc[[1,3],[0,2]]
print(data)
'''
                   A         C
2019-02-16  0.606509 -0.114394
2019-02-17  0.227347  1.813924
'''

相关文章

  • 2020-02-12

    Pandas笔记之创建 Pandas DataFrame DataFrame为Pandas的第二种主要数据结构,是...

  • Pandas

    Pandas 目录一、Pandas基础二、Pandas三大数据结构1.Series2.DataFrame3.Ind...

  • 2021-12-31 Python-23

    pandas pandas数据结构 pandas 有 2 个常用的数据结构:Series 和 Dataframe一...

  • pandas中的 .iloc 和 .loc

    Pandas 基本的数据结构是 Series(数组) 和 DataFrame(类似二维数组),Pandas 提供了...

  • pandas学习-4

    Pandas数据结构Dataframe:基本概念及创建 二维数组"Dataframe:是一个表格型的数据结构,包含...

  • 使用python进行数据分析<五>(pandas入门

    pandas基于Numpy构建 pandas 的数据结构介绍 Series DataFrame

  • 2.5 数据结构Dataframe:基本概念及创建

    【课程2.5】 Pandas数据结构Dataframe:基本概念及创建"二维数组"Dataframe:是一个表格...

  • pandas入门 02 数据结构

    0 pandas数据结构简介 pandas主要处理下面三种数据结构 Series DataFrame Panel ...

  • pandas 数据结构简介

    pandas 数据结构及构建 pandas 主要有两种数据结构: Series 和 DataFrame。Serie...

  • pandas入门

    引入pandas和常用的数据结构Series,DataFrame 一、pandas的数据结构的介绍 1.Serie...

网友评论

    本文标题:Pandas (二) :DataFrame数据结构

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