Pandas DataFrame的用法(非常详细)
Pandas 中,DataFrame(数据帧)是一个表格型的数据结构,如下图所示:

图 1 表格型的数据结构
DataFrame 含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看作是由 Series 组成的字典(共同用一个索引)。
DataFrame 的构造方法如下:
以下代码为使用列表创建:
以下代码使用 ndarrays 创建,ndarray 的长度必须相同,如果传递了 index,则索引的长度应等于数组的长度。如果没有传递索引,则默认情况下,索引为 range(n),其中 n 是数组长度。

图 2 表格形式
Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:
也可以返回多行数据,使用 [[...]] 格式,... 为各行的索引,以逗号隔开:
① 可以通过将行标签传递给 loc() 函数来选择行,代码为:
② 可以通过将整数位置传递给 iloc() 函数来选择行,例如:
① 可以使用“:”运算符选择多行。例如:
② 使用索引标签从 DataFrame 中删除行。如果标签重复,则会删除多行。

图 1 表格型的数据结构
DataFrame 含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看作是由 Series 组成的字典(共同用一个索引)。
DataFrame 的构造方法如下:
pandas.DataFrame(data, index, columns, dtype, copy)
- 参数 data 为一组数据(ndarray、series,map,lists,dict 等类型);
- index 为索引值,或者可以称为行标签;
- columns 为列标签,默认为 RangeIndex(0,1,2,…,n);
- dtype 为数据类型;
- copy 为拷贝数据,默认为 False。
Pandas DataFrame的创建
数据帧(DataFrame)可以使用各种输入创建,如列表、字典、Series 等。1) 创建一个空的DataFrame
以下代码实现创建空的 DataFrame:import pandas as pd df=pd.DataFrame() print(df)运行程序,输出如下:
Empty DataFrame
Columns:[]
Index:[]
2) 从列表创建DataFrame
可以使用列表创建 DataFrame,例如:import pandas as pd data = [1,4,7,6,9] df = pd.DataFrame(data) print(df) 0 0 1 1 4 2 7 3 6 4 9 data2 = [['Alex',10], ['Bob',12], ['Clarke',13]] df2 = pd.DataFrame(data2, columns=['Name', 'Age']) print(df2) Name Age 0 Alex 10.0 1 Bob 12.0 2 Clarke 13.0 data3 = [['Alex',10], ['Bob',12], ['Clarke',13]] df3 = pd.DataFrame(data3, columns=['Name', 'Age'], dtype=float) print(df3) Name Age 0 Alex 10.0 1 Bob 12.0 2 Clarke 13.0由以上结果可以观察到,dtype 参数将 Age 列的类型更改为浮点型。
3) 从ndarrays/Lists的字典来创建DataFrame
所有的 ndarrays 必须具有相同的长度。如果传递了索引(index),则索引的长度应等于数组的长度。如果没有传递索引,则默认情况下,索引将为 range(n),其中 n 为数组长度。以下代码为使用列表创建:
import pandas as pd data = [['Google',10], ['Runoob',12], ['Wiki',13]] df = pd.DataFrame(data, columns=['Site','Age'], dtype=float) print(df)运行程序,输出如下:
Site Age 0 Google 10.0 1 Runoob 12.0 2 Wiki 13.0
以下代码使用 ndarrays 创建,ndarray 的长度必须相同,如果传递了 index,则索引的长度应等于数组的长度。如果没有传递索引,则默认情况下,索引为 range(n),其中 n 是数组长度。
import pandas as pd data = {'Site': ['Google', 'Runoob', 'Wiki'], 'Age': [10, 12, 13]} df = pd.DataFrame(data) print(df)运行程序,输出如下:
Site Age 0 Google 10 1 Runoob 12 2 Wiki 13从以上输出结果可以知道,DataFrame 的数据类型是一个表格,包含 rows(行)和 columns(列),如下图所示:

图 2 表格形式
4) 使用字典创建
还可以使用字典(key/value)创建 DataFrame,其中字典的 key 为列名: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.0 NaN 1 5 10.0 20.0由以上结果可看出,没有对应的部分数据为 NaN。
Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:
import pandas as pd data = { "calories": [430, 390, 390], "duration": [50, 40, 45] } # 数据载入到 DataFrame 对象 df = pd.DataFrame(data) # 返回第一行和第二行 print(df.loc[[0, 1]])运行程序,输出如下:
calories duration 0 430 50 1 390 40注意,返回结果其实就是一个 Pandas Series 数据。
也可以返回多行数据,使用 [[...]] 格式,... 为各行的索引,以逗号隔开:
import pandas as pd data = { "calories": [430, 390, 390], "duration": [50, 40, 45] } # 数据载入到 DataFrame 对象 df = pd.DataFrame(data) # 返回第一行和第二行 print(df.loc[[0, 1]])运行程序,输出如下:
calories duration 0 430 50 1 390 40注意,返回结果其实就是一个 Pandas DataFrame 数据。
Pandas DataFrame的常见操作
对于已创建的数据帧,我们可以进行列选择、添加和删除相关操作。1) 列选择
下面代码将实现从数据帧(DataFrame)中选择一列:import pandas as pd d = {'one': pd.Series([1, 4, 7], index=['a', 'b', 'c']), 'two': pd.Series([1, 4, 7, 9], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) print(df['one'])运行程序,输出如下:
a 1.0 b 4.0 c 7.0 Name: one, dtype: float64
2) 列添加
下面代码将实现向现有数据框添加一个新列:import pandas as pd d = {'one': pd.Series([1, 4, 7], index=['a', 'b', 'c']), 'two': pd.Series([1, 4, 7, 9], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) # 通过传递为序列添加新列 print ("通过传递为序列添加新列:") df['three']=pd.Series([10,20,30],index=['a','b','c']) print(df) print ("使用 DataFrame 中的现有列添加新列:") df['four']=df['one']+df['three'] print(df)运行程序,输出如下:
通过传递为序列添加新列: one two three a 1.0 1.0 10.0 b 4.0 4.0 20.0 c 7.0 7.0 30.0 d NaN 9.0 NaN 使用 DataFrame 中的现有列添加新列: one two three four a 1.0 1.0 10.0 11.0 b 4.0 4.0 20.0 24.0 c 7.0 7.0 30.0 37.0 d NaN 9.0 NaN NaN
3) 列删除
列可以删除或弹出,如下代码来实现列删除操作:# 使用前面的数据帧,我们将使用 del() 函数删除一列 import pandas as pd d = {'one': pd.Series([1, 4, 7], index=['a', 'b', 'c']), 'two': pd.Series([1, 4, 7, 9], index=['a', 'b', 'c', 'd']), 'three': pd.Series([10, 20, 30], index=['a', 'b', 'c'])} df = pd.DataFrame(d) print ("数据帧是:") print(df) # 使用 del() 函数 print ("使用 del() 函数删除第一列:") del df['one'] print(df) # 使用 pop() 函数 print ("使用 pop() 函数删除另一列:") df.pop('two') print(df)运行程序,输出如下:
数据帧是: one two three a 1.0 1 10.0 b 4.0 4 20.0 c 7.0 7 30.0 d NaN 9 NaN 使用 del() 函数删除第一列: two three a 1 10.0 b 4 20.0 c 7 30.0 d 9 NaN 使用 pop() 函数删除另一列: three a 10.0 b 20.0 c 30.0 d NaN
4) 行选择、添加和删除
现在将通过下面实例来了解行选择、添加和删除。我们从选择的概念开始。① 可以通过将行标签传递给 loc() 函数来选择行,代码为:
import pandas as pd d = {'one': pd.Series([1, 4, 7], index=['a', 'b', 'c']), 'two': pd.Series([1, 4, 7, 9], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) print(df.loc['b'])运行程序,输出如下:
one 4.0 two 4.0 Name: b, dtype: float64以上结果是一系列标签作为 DataFrame 的列名称。而且,系列的名称是检索的标签。
② 可以通过将整数位置传递给 iloc() 函数来选择行,例如:
import pandas as pd d = {'one': pd.Series([1, 4, 7], index=['a', 'b', 'c']), 'two': pd.Series([1, 4, 7, 9], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) print(df.iloc[2])运行程序,输出如下:
one 7.0 two 7.0 Name: c, dtype: float64
5) 行切片
行切片操作主要包括选择行、附加行以及删除行。① 可以使用“:”运算符选择多行。例如:
import pandas as pd d = {'one': pd.Series([1, 4, 7], index=['a', 'b', 'c']), 'two': pd.Series([1, 4, 7, 9], index=['a', 'b', 'c', 'd'])} df = pd.DataFrame(d) print(df[2:4])运行程序,输出如下:
one two c 7.0 7.0 d NaN 9.0
② 使用索引标签从 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) # 删除标签为 0 的行 df = df.drop(0) print(df)运行程序,输出如下:
a b 1 3 4 2 7 8在上面的代码中,一共有两行被删除,因为这两行包含相同的标签 0。