Series 和 DataFrame 简介

在 Python 的pandas库中,DataFrame是一个二维的、带标签的数据结构,非常适合处理表格类型的数据(类似数据库表或 Excel 表格)。它由行和列组成,每一行和每一列都有对应的标签。Series则是一个一维的、带标签的数组,可以看作是DataFrame的单个列。

DataFrame

创建 DataFrame

可以通过 pd.DataFrame() 创建一个空的 DataFrame,适用于后续动态填充数据。

# 创建空 DataFrame
df = pd.DataFrame()
print(df)

用字典创建 DataFrame

最常用的方法是用字典创建 DataFrame,其中字典的键作为列名,值作为列数据。

# 用字典创建 DataFrame
data = {'name': ['apple', 'egg', 'watermelon'], 
        'color': ['red', 'yellow', 'green'], 
        'num': [30, 40, 50]}

# 1. 直接创建
df1 = pd.DataFrame(data)
print(df1)

自定义列顺序

可以通过 columns 参数指定列的顺序:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df2 = pd.DataFrame(data, columns=['name', 'num', 'color'])
print(df2)

自定义行索引

可以通过 index 参数设置行标签

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
print(df3)

也可以使用 range() 生成索引:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3_1 = pd.DataFrame(data, index=range(0, 3, 1))
print(df3_1)

添加额外列

如果指定的列名超出字典中的键,新列会填充 NaN:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
# 4. 列名数超过原数据则创建空列
df4 = pd.DataFrame(data, columns=['name', 'num', 'color', 'price'])
print(df4)

获取行和列名

获取行索引

使用 index.values.tolist() 获取行索引列表:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
print(df3.index.values.tolist())

获取列名

获取列名有两种常用方法:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
# 方法 1
print(list(df3))
# 方法 2
print(df3.columns.values.tolist())

如果只用 .values,返回的是 NumPy 数组

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
print(df3.columns.values)

索引和切片

DataFrame 支持两种主要的索引方式:

  • loc:基于标签(行名和列名)进行索引。

  • iloc:基于整数位置进行索引。

按行操作

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
# loc:选择特定行和列
print(df3.loc[['No.1', 'No.3'], ['name', 'color']])
print(df3.loc['No.1':'No.3', 'name':'color'])
# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])

# iloc:按位置切片,取第 2 行之后
print(df3.iloc[1:])

按列操作

可以直接用列名访问,也可以用 loc 或 iloc:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])

# 直接访问列
print(df3['name'])
# loc:选择列范围
print(df3.loc[:, 'name':'num'])
# iloc:按位置选择列
print(df3.iloc[:, 1])

行和列结合

同时操作行和列:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
# iloc:切片行列
print(df3.iloc[1:, -2:])

条件过滤

筛选num大于30

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
# 筛选 num > 30 的行
print(df3[df3['num'] > 30])

筛选num大于30的name

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
# 筛选 num > 30 的行的 name 列
print(df3['name'][df3['num'] > 30])

修改 DataFrame

添加列

添加空列

可以用空字符串或默认值初始化:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
# 方法 1:空字符串
df3['price'] = ''
print(df3)

用 Series 初始化

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])

# 方法 2:用 Series 初始化
df3['price'] = pd.Series(dtype='int', index=['No.1', 'No.2', 'No.3'])
# 等价于
df3['price'] = 0
print(df3)

注意:不能用空列表 [] 初始化,会报错。

添加带数据的列

直接赋值会将新列添加到最后:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])

df3['price'] = [1, 2, 3]
print(df3)

如果需要指定索引顺序,可以用 Series:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])

df3['price'] = pd.Series([1, 2, 3], index=['No.2', 'No.1', 'No.3'])
print(df3)

注意:如果用 Series 添加但未指定 index,会因索引不匹配导致所有值变为 NaN:

在指定位置插入列

使用 insert() 方法指定插入位置:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])

df3.insert(2, 'price', [1, 2, 3])
print(df3)

删除行和列

删除行

使用 drop() 删除行,默认不修改原数据,除非指定 inplace=True:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
df3.drop('No.3', inplace=True)
print(df3)

删除列

使用 del(直接修改原数据):

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
del df3['num']
print(df3)

使用 drop(需指定 axis=1):

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
df3.drop('num', axis=1, inplace=True)
print(df3)

读取和写入文件

从 CSV 读取

使用 read_csv(),支持多种参数:

# 用字典创建 DataFrame
import pandas as pd
df = pd.read_csv('test.csv', na_values='NAN', parse_dates=['date'], infer_datetime_format=True)
  • na_values:指定缺失值的表示形式。

  • parse_dates 和 infer_datetime_format:将指定列解析为日期格式,提升性能。

从 Excel 读取

使用 read_excel():

# 用字典创建 DataFrame
import pandas as pd
df = pd.read_excel('test.xlsx', sheet_name='sheet1', na_values='n/a')
  • sheet_name:指定读取的表格名称。

  • na_values:定义缺失值。

写入文件

写入 CSV

使用 to_csv(),index=False 可避免写入行索引:

# 用字典创建 DataFrame
import pandas as pd
df = pd.read_excel('test.xlsx', sheet_name='sheet1', na_values='n/a')
df.to_csv("test.csv", index=False)

写入excel

# 用字典创建 DataFrame
import pandas as pd
df = pd.read_excel('test.xlsx', sheet_name='sheet1', na_values='n/a')
df.to_excel("test.xlsx", sheet_name='sheet1', startcol=0, index=False)

其他常用操作

查看前几行

使用 head() 查看 DataFrame 前几行,默认显示 5 行:

# 用字典创建 DataFrame
import pandas as pd

data = {'name': ['apple', 'egg', 'watermelon'],
        'color': ['red', 'yellow', 'green'],
        'num': [30, 40, 50]}
df3 = pd.DataFrame(data, index=['No.1', 'No.2', 'No.3'])
print(df3.head())

调整显示设置

调整 pandas 的显示选项以完整查看 DataFrame:

# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置显示宽度
pd.set_option('display.width', None)

Series

Series 是 DataFrame 的基础组件,是一维带标签的数据结构。例如,从 DataFrame 中提取一列就是 Series

创建 Series

import pandas as pd

# 用列表创建
s = pd.Series([10, 20, 30])
print(s)

看某个值

# 用位置看
print(s[1])  # 第2个值

改值

s[0] = 100  # 把第一个值改成 100
print(s)

加法

import pandas as pd

# 用列表创建
s = pd.Series([10, 20, 30])
# 每个值都加 5
print(s + 5)

求和

import pandas as pd

# 用列表创建
s = pd.Series([10, 20, 30])
print(s.sum())  # 所有值加起来

找最大值

import pandas as pd

# 用列表创建
s = pd.Series([10, 20, 30])
print(s.max())  # 最大的值

加新值

s[3] = 40  # 加一个新值
print(s)

排序

import pandas as pd

# 用列表创建
s = pd.Series([20, 10, 30])
print(s.sort_values())  # 从小到大排序