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()) # 从小到大排序