Pandas - DataFrame数据帧
数据帧(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。
数据帧(DataFrame)的功能特点:
- 潜在的列是不同的类型
- 大小可变
- 标记轴(行和列)
- 可以对行和列执行算术运算
结构体
假设要创建一个包含学生数据的数据帧。
可视为数据库表或电子表格数据,参考以下图示:
[图片上传失败...(image-60946-1640592968104)]
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