Pandas DataFrame(数据帧)

Pandas - DataFrame数据帧

数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。
数据帧(DataFrame)的功能特点:

  • 潜在的列是不同的类型
  • 大小可变
  • 标记轴(行和列)
  • 可以对行和列执行算术运算

结构体

假设要创建一个包含学生数据的数据帧。
可视为数据库表或电子表格数据,参考以下图示:
[图片上传失败...(image-60946-1640592968104)]

image.png

pandas.DataFrame

pandas中的DataFrame可以使用以下构造函数创建

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

参数说明:

  • data :数据采取各种形式,如: ndarray , series , map , lists , dict , constant 和另一个 DataFrame 。
  • index :对于行标签,要用于结果帧的索引是可选缺省值 np.arrange(n) ,如果没有传递索引值。
  • columns :对于列标签,可选的默认语法是 - np.arange(n) 。 这只有在没有索引传递的情况下才是这样。
  • dtype :每列的数据类型。
  • copy :如果默认值为 False ,则此命令(或任何它)用于复制数据。

创建

Pandas数据帧(DataFrame)可以使用各种输入创建,如:

  • 列表
  • 字典
  • 系列
  • Numpy ndarrays
  • 另一个数据帧(DataFrame)

在本章的后续章节中,将看到如何使用这些输入创建数据帧(DataFrame)。


创建一个空的DataFrame

创建基本数据帧是空数据帧

示例:

import pandas as pd
df = pd.DataFrame()
print (df)

输出如下:

Empty DataFrame
Columns: []
Index: []

从列表创建DataFrame

可以使用单个列表或列表列表创建数据帧(DataFrame)

示例1:传入单个列表,会自动生成索引和列

import pandas as pd
data = ['a','b','c','d','e']
df = pd.DataFrame(data)
print (df)

输出如下:

   0
0  a
1  b
2  c
3  d
4  e

示例2:传入多个列表和列名

import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print (df)

输出如下:

     Name  Age
0    Alex   10
1     Bob   12
2  Clarke   13

示例3:传入时设置 dtype

import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print (df)

输出如下:

     Name   Age
0    Alex  10.0
1     Bob  12.0
2  Clarke  13.0

dtype 只是将 Age 设为了浮点型,因为数据中只有 Age 能转为浮点型


从ndarrays/Lists的字典来创建DataFrame

所有的 ndarrays 必须具有相同的长度。如果传递了索引( index ),则索引的长度应等于数组的长度。
如果没有传递索引,则默认情况下,索引将为 range(n) ,其中 n 为数组长度。

示例1:传入字典创建DataFrame

import pandas as pd
data = {'Name':['Tom','Jack','Steve','Ricky'],
        'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print (df)

输出如下:

    Name  Age
0    Tom   28
1   Jack   34
2  Steve   29
3  Ricky   42

索引 0,1,2,3 这四个默认索引是使用 range(n) 生成的

示例2:创建时使用数组创建自定义的索引

import pandas as pd
data = {'Name':['Tom','Jack','Steve','Ricky'],
             'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print (df)

输出如下:

          Name  Age
rank1    Tom   28
rank2    Jack   34
rank3  Steve   29
rank4  Ricky   42

index 参数会为每一行分配一个索引

从列表创建数据帧DataFrame

字典列表可作为输入数据传递以用来创建数据帧(DataFrame),字典键默认为列名

示例1:通过 list 创建 DaraFrame

import pandas as pd
data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]
df = pd.DataFrame(data)
print (df)

输出如下:

    a   b     c
0  1   2   NaN
1  5  10  20.0

NaN 因为缺失值,被使用 NaN 填充

示例2:使用自定义的列表创建索引
以下示例显示如何通过传递字典列表和行索引来创建数据帧(DataFrame)。

import pandas as pd
data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]
df = pd.DataFrame(data,index=['first','second'])
print (df)

输出如下:

    a   b     c
0  1   2   NaN
1  5  10  20.0

示例3:以下示例显示如何使用字典,行索引和列索引列表创建数据帧(DataFrame)。

import pandas as pd
data = [{'a':1,'b':2},{'a':5,'b':10,'c':20}]
df1 = pd.DataFrame(data,index=['first','second'],columns=['a','b'])
df2 = pd.DataFrame(data,index=['first','second'],columns=['a','b1'])
print (df1)
print ('\n')
print (df2)

输出如下:

              a   b
first        1   2
second  5  10

             a  b1
first       1 NaN
second  5 NaN

df2 使用字典键以外的列索引创建 DataFrame ; 因此,附加了NaN到位置上。 而 df1 是使用列索引创建的,与字典键相同,所以也附加了 NaN


从系列的字典来创建DataFrame

字典的系列可以传递以形成一个DataFrame。 所得到的索引是通过的所有系列索引的并集

示例:

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

输出如下:

   one  two
a  1.0    1
b  2.0    2
c  3.0    3
d  NaN    4

对于第一个系列,观察到没有传递标签 d ,但在结果中,对于 d 标签,附加了 NaN


列选择,添加和删除

选择列

示例:从数据帧(DataFrame)中选择一列

import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
      'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print ('df为:')
print (df)
print ('选择第一列为:')
print (df['one'])

输出如下:

df为:
   one    two
a  1.0       1
b  2.0       2
c  3.0       3
d  NaN    4
选择第一列为:
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64

添加列

示例:通过向现有数据框添加一个新列

import pandas as pd

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

df = pd.DataFrame(d)


print ("新加一个列,这个列使用series创建:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print (df)

print ("新的列使用其他列的和组成:")
df['four']=df['one']+df['three']

print (df)

输出如下:

新加一个列,这个列使用series创建:
   one  two  three
a  1.0    1   10.0
b  2.0    2   20.0
c  3.0    3   30.0
d  NaN    4    NaN

新的列使用其他列的和组成:
   one  two  three  four
a  1.0    1   10.0  11.0
b  2.0    2   20.0  22.0
c  3.0    3   30.0  33.0
d  NaN    4    NaN   NaN

删除列

示例:列可以删除或弹出

import pandas as pd

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

df = pd.DataFrame(d)
print ("原DataFrame是:")
print (df)

# using del function
print ("删除一列:")
del df['one']
print (df)

# using pop function
print ("弹出一列:")
print (df.pop('two'))
print ('弹出后:')
print (df)

输出如下:

原DataFrame是:
   one  two  three
a  1.0    1   10.0
b  2.0    2   20.0
c  3.0    3   30.0
d  NaN    4    NaN

删除一列:
   two  three
a    1   10.0
b    2   20.0
c    3   30.0
d    4    NaN

弹出一列:
a    1
b    2
c    3
d    4
Name: two, dtype: int64

弹出后:
   three
a   10.0
b   20.0
c   30.0
d    NaN

使用 pop 弹出,会返回弹出的列,同时会在原数组中删除这一列

行选择,添加和删除

选择行:使用标签loc()选择

示例1:通过将行标签传递给 loc() 函数来选择行

import pandas as pd

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

df = pd.DataFrame(d)
print ('原数组:')
print(df)

print('选择b这一行')
print (df.loc['b'])

输出如下:

原数组:
   one  two
a  1.0    1
b  2.0    2
c  3.0    3
d  NaN    4
选择b这一行
one    2.0
two    2.0
Name: b, dtype: float64

结果是一系列标签作为 DataFrame 的列名称。 而且,系列的名称是检索的标签

示例2:选择多行

import pandas as pd

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

df = pd.DataFrame(d)
print (df.loc[['b','c']])

输出如下:

   one  two
b  2.0    2
c  3.0    3

选择行,使用下标iloc()选择

示例1:可以通过将整数位置传递给 iloc() 函数来选择行

import pandas as pd

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

df = pd.DataFrame(d)
print (df.iloc[2])

输出如下:

原数组:
   one  two
a  1.0    1
b  2.0    2
c  3.0    3
d  NaN    4

选择第3行:
one    3.0
two    3.0
Name: c, dtype: float64

示例2:多行选择

import pandas as pd

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

df = pd.DataFrame(d)
print (df.iloc[[2,3]])

输出如下:

   one  two
c  3.0    3
d  NaN    4

选择行:行切片

示例:可以使用 : 运算符选择多行

import pandas as pd

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

df = pd.DataFrame(d)
print (df[2:4])

输出如下:

   one  two
c  3.0    3
d  NaN    4

添加行

示例:使用append()函数将新行添加到DataFrame

import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])

df = df.append(df2)
print (df)

输出如下:

   a  b
0  1  2
1  3  4
0  5  6
1  7  8

删除行

示例:使用索引标签从DataFrame中删除或删除行。
如果标签重复,则会删除多行

import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])

df = df.append(df2)
print ('原数组:')
print (df)

df = df.drop(0)
print ('删除后的数组')
print (df)

输出如下:

原数组:
   a  b
0  1  2
1  3  4
0  5  6
1  7  8

删除后的数组
   a  b
1  3  4
1  7  8

在上面的例子中,一共有两行被删除,因为这两行包含相同的标签 0

你可能感兴趣的:(Pandas DataFrame(数据帧))