Pandas 学习笔记 (二) :DataFrame数据结构

DataFrame介绍

DataFrame是一种类似表格形式的二维数据结构,其数据是以行和列的表格方式排列的。

例如我们存储一个人的相关信息:

    age  name sex
0  25.0   Bob   F
1  23.0   Tom   F
2   NaN  Andy   M

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

lists = [{'name':'Bob','age':25,'sex':'F'},
        {'name':'Tom','age':23,'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('20180508'),
    'D':np.arange(4)
}
df = pd.DataFrame(dic)
print(df)
'''
   A   B          C  D
0  1  26 2018-05-08  0
1  1  26 2018-05-08  1
2  1  26 2018-05-08  2
3  1  26 2018-05-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('20180508', periods=7)
columns = list('ABCD')
df = pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)
print(df)
'''
                   A         B         C         D
2018-05-08 -2.028688  0.439382 -1.939392 -0.876227
2018-05-09  1.322120  1.722774 -0.825087  0.830235
2018-05-10 -0.296324  2.465106  1.084785  0.983708
2018-05-11  0.277785  0.935043 -0.299506  0.514187
2018-05-12 -2.089254 -0.275968 -1.466165  0.322209
2018-05-13  0.205912 -1.642673 -0.628401 -0.053906
2018-05-14  2.615111  0.871448 -0.428041  0.857018'''
  • 添加 列
df['E'] = 1
print(df)
'''
                   A         B         C         D  E
2018-05-08 -2.360552  0.064194  0.455912  1.067189  1
2018-05-09  1.172144  1.110124 -2.108127 -1.551015  1
2018-05-10 -1.481258  0.518018  0.592958  0.024791  1
2018-05-11 -0.388603  1.556626  1.176389 -0.126905  1
2018-05-12  0.809137 -0.049594  0.057527  0.690147  1
2018-05-13 -0.742054 -0.075211 -0.823174  0.220592  1
2018-05-14 -0.990349 -1.191461  1.572127 -0.480145  1'''
  • 删除 列
df.pop('E') 
print(df)
'''
                   A         B         C         D
2018-05-08 -0.448693 -1.974794 -0.041380 -1.595393
2018-05-09  1.724595 -0.096974 -0.026345  0.984426
2018-05-10 -0.203396  0.107673  0.532353  0.119386
2018-05-11  0.528793  2.050661  0.854727 -2.008437
2018-05-12  1.941374 -0.777696 -1.143443 -0.744675
2018-05-13 -1.072986  0.522539  1.263841  0.324437
2018-05-14  0.072737 -1.201634 -0.229115 -0.289056'''

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

  • 添加 行
df2 = pd.DataFrame(2, index=pd.date_range('20180515',periods=1), columns=columns, dtype=float)
df = df.append(df2)
print(df)
'''
                   A         B         C         D
2018-05-08  1.501641  0.283082  0.498203 -0.962883
2018-05-09  0.300840  1.181264  1.048192  1.692875
2018-05-10 -0.151108 -0.938684 -1.097083  0.112622
2018-05-11  0.217315  0.601876 -0.063849  1.971134
2018-05-12  0.651812 -0.378796 -0.338030  0.337614
2018-05-13 -0.356199 -0.698849  2.245919  0.819013
2018-05-14 -0.852322 -0.499241 -1.497437  0.403296
2018-05-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
2018-05-08  0.659580 -0.915754
2018-05-09  0.533189  0.770098
2018-05-10  0.612976 -1.550603
2018-05-11 -0.461758  0.123775
2018-05-12  0.284651  0.590690
2018-05-13  1.054701  0.148838
2018-05-14 -0.581583  1.651076
2018-05-15  2.000000  2.000000'''

b. 标签名 + 方向

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

a. 指定 行标签 index


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

b. 标签名 + 方向

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

选择

例子数据

index = pd.date_range('20180508', periods=7)
columns = list('ABCD')
df = pd.DataFrame(np.random.randn(7,4), index=index, columns=columns)
  • 标签函数 .loc

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

a. 使用 行标签

data = df.loc['20180508']
print(data)
'''
A    0.172456
B   -0.196708
C   -0.358772
D    0.813195
Name: 2018-05-08 00:00:00, dtype: float64'''

b. 使用 列标签

data = df.loc[:,'A':'D']
print(data)
'''
                   A         B         C         D
2018-05-08  0.172456 -0.196708 -0.358772  0.813195
2018-05-09  0.606509 -1.150471 -0.114394 -0.968890
2018-05-10 -0.223689  0.583463  0.862829  1.012615
2018-05-11  0.227347  0.643138  1.813924 -0.316260
2018-05-12  0.053666  0.388430 -0.174752 -0.711354
2018-05-13 -0.373851  0.811530 -0.602160 -0.775848
2018-05-14 -0.053576  0.986285  2.754268 -1.364663'''

c. 行标签 + 列标签

data = df.loc['20180508':'20180511','B':]
print(data)
'''
                   B         C         D
2018-05-08 -0.196708 -0.358772  0.813195
2018-05-09 -1.150471 -0.114394 -0.968890
2018-05-10  0.583463  0.862829  1.012615
2018-05-11  0.643138  1.813924 -0.316260'''
  • 索引函数 .iloc

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

a. 行索引

data = df.iloc[1:3]
print(data)
'''
                   A         B         C         D
2018-05-09  0.606509 -1.150471 -0.114394 -0.968890
2018-05-10 -0.223689  0.583463  0.862829  1.012615'''

b. 列索引

data = df.iloc[:,[2,3]]
print(data)
'''
                   C         D
2018-05-08 -0.358772  0.813195
2018-05-09 -0.114394 -0.968890
2018-05-10  0.862829  1.012615
2018-05-11  1.813924 -0.316260
2018-05-12 -0.174752 -0.711354
2018-05-13 -0.602160 -0.775848
2018-05-14  2.754268 -1.364663'''

c. 行索引 + 列索引

data = df.iloc[[1,3],[0,2]]
print(data)
'''
                   A         C
2018-05-09  0.606509 -0.114394
2018-05-11  0.227347  1.813924'''

猜你喜欢

转载自blog.csdn.net/lolita0164/article/details/80238204