首页 > 编程笔记 > Python笔记 阅读:11

Pandas DataFrame的用法(非常详细)

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


图 1 表格型的数据结构

DataFrame 含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看作是由 Series 组成的字典(共同用一个索引)。

DataFrame 的构造方法如下:
pandas.DataFrame(data, index, columns, dtype, copy)

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。

相关文章