Pandas2.2 DataFrame
Reshaping sorting transposing
方法 | 描述 |
---|---|
DataFrame.droplevel(level[, axis]) | 用于**从 DataFrame 的索引(行或列)中删除指定层级(level)**的方法 |
DataFrame.pivot(*, columns[, index, values]) | 用于重塑 DataFrame 的结构的方法 |
DataFrame.pivot_table([values, index, …]) | 用于**创建透视表(pivot table)**的函数 |
DataFrame.reorder_levels(order[, axis]) | 用于重新排序多级索引(MultiIndex)的层级顺序的方法 |
DataFrame.sort_values(by, *[, axis, …]) | 用于按指定列或行的值对 DataFrame 进行排序的方法 |
DataFrame.sort_index(*[, axis, level, …]) | 用于按索引(行或列)对 DataFrame 进行排序的方法 |
DataFrame.nlargest(n, columns[, keep]) | 用于选取 DataFrame 中某列或多列的前 n 个最大值对应的行的方法 |
DataFrame.nsmallest(n, columns[, keep]) | 用于选取 DataFrame 中某列或多列的前 n 个最小值对应的行的方法 |
DataFrame.swaplevel([i, j, axis]) | 用于交换多级索引(MultiIndex)中两个层级的位置的方法 |
DataFrame.stack([level, dropna, sort, …]) | 用于将 DataFrame 的列索引“压入”行索引中,从而增加行数并减少列数的方法 |
DataFrame.unstack([level, fill_value, sort]) | 用于将 DataFrame 的行索引层级“展开”为列索引层级的方法 |
DataFrame.swapaxes(axis1, axis2[, copy]) | 用于**交换 DataFrame 的两个轴(axis)**的方法 |
DataFrame.melt([id_vars, value_vars, …]) | 用于**将 DataFrame 从宽格式转换为长格式(“融化”操作)**的方法 |
DataFrame.explode(column[, ignore_index]) | 用于将 DataFrame 中某一列的列表元素“展开”为多行的方法 |
pandas.DataFrame.explode()
pandas.DataFrame.explode()
是一个用于将 DataFrame 中某一列的列表元素“展开”为多行的方法。它常用于处理嵌套数据结构,例如某列中包含多个值(以列表形式存储),通过 explode()
可以将这些值拆分成独立的行。
它是 Pandas 中非常重要的数据重塑工具之一,特别适用于处理 JSON、嵌套数组等结构化数据。
📌 方法签名
DataFrame.explode(column, ignore_index=False)
🔧 参数说明
参数 | 类型 | 说明 |
---|---|---|
column | str | 要展开的列名;该列必须是包含可迭代对象(如 list)的列 |
ignore_index | bool,默认 False | 是否重置索引(从 0 开始) |
✅ 返回值
- 返回一个新的
DataFrame
,其中指定列中的每个元素被展开为一行; - 其他列的值会复制到每一行;
- 原始数据不会被修改。
🧪 示例代码及结果
示例 1:基本用法(单列展开)
import pandas as pddf = pd.DataFrame({'A': [[1, 2, 3], [4, 5], [6]],'B': ['x', 'y', 'z']
})print("Original DataFrame:")
print(df)
输出:
A B
0 [1, 2, 3] x
1 [4, 5] y
2 [6] z
# 展开 A 列
exploded = df.explode('A')
print("\nAfter explode('A'):")
print(exploded)
输出:
A B
0 1 x
0 2 x
0 3 x
1 4 y
1 5 y
2 6 z
注意:原始索引保留,可以使用
ignore_index=True
来重置。
示例 2:重置索引(ignore_index=True
)
# 展开并重置索引
exploded_reset = df.explode('A', ignore_index=True)
print("\nAfter explode('A', ignore_index=True):")
print(exploded_reset)
输出:
A B
0 1 x
1 2 x
2 3 x
3 4 y
4 5 y
5 6 z
示例 3:展开空列表和缺失值(NaN
)
df_with_nan = pd.DataFrame({'A': [[1, 2], [], None, [3]],'B': ['x', 'y', 'z', 'w']
})print("Original DataFrame with empty lists and NaN:")
print(df_with_nan)
输出:
A B
0 [1, 2] x
1 [] y
2 NaN z
3 [3] w
# 展开 A 列
exploded_with_nan = df_with_nan.explode('A')
print("\nAfter explode on column with empty lists and NaN:")
print(exploded_with_nan)
输出:
A B
0 1 x
0 2 x
1 NaN y
2 NaN z
3 3 w
注意:
- 空列表会被展开为空行(即
NaN
); None
或NaN
也会保留为NaN
。
示例 4:对字符串列表进行展开
df_str = pd.DataFrame({'tags': [['python', 'data science'], ['machine learning', 'AI'], ['pandas']],'id': [1, 2, 3]
})print("Original DataFrame with string lists:")
print(df_str)
输出:
tags id
0 [python, data science] 1
1 [machine learning, AI] 2
2 [pandas] 3
# 展开 tags 列
exploded_str = df_str.explode('tags')
print("\nAfter explode on string lists:")
print(exploded_str)
输出:
tags id
0 python 1
0 data science 1
1 machine learning 2
1 AI 2
2 pandas 3
示例 5:展开多列(需多次调用或结合 melt()
)
虽然 explode()
一次只能处理一列,但你可以多次调用或结合其他方法实现多列展开。
df_multi = pd.DataFrame({'A': [[1, 2], [3]],'B': [[4], [5, 6]]
})print("Original DataFrame with multiple list columns:")
print(df_multi)
输出:
A B
0 [1, 2] [4]
1 [3] [5, 6]
# 分别展开 A 和 B 列
exploded_A = df_multi.explode('A')
exploded_AB = exploded_A.explode('B')print("\nAfter exploding both A and B:")
print(exploded_AB)
输出:
A B
0 1 4
0 2 4
1 3 5
1 3 6
🧠 应用场景
场景 | 说明 |
---|---|
处理 JSON 数据 | 如解析 API 返回的嵌套结构 |
日志分析 | 将事件标签、关键词等展开以便统计 |
推荐系统 | 处理用户兴趣标签、历史行为等 |
文本挖掘 | 将分词后的词语展开便于词频统计 |
可视化准备 | 准备适合绘制柱状图、词云的数据格式 |
⚠️ 注意事项
explode()
只能作用于包含可迭代对象(如list
)的列;- 如果列中包含非可迭代对象(如
int
,str
),会抛出错误; - 空列表会展开为
NaN
; None
或NaN
会保留为NaN
;- 使用
ignore_index=True
可避免重复索引问题; - 若需展开多列,需多次调用或结合
melt()
、apply()
等方法。
✅ 总结对比
方法 | 是否推荐使用 | 说明 |
---|---|---|
explode(column) | ✅ 推荐 | 快速将列表列展开为多行 |
explode(column, ignore_index=True) | ✅ 推荐 | 自动重置索引 |
explode() + dropna() | ✅ 推荐 | 移除展开后产生的 NaN 行 |
explode() + groupby() | ✅ 推荐 | 对展开后的数据进行统计分析 |
explode() + value_counts() | ✅ 推荐 | 统计展开后各值出现频率 |
你可以根据实际需求选择是否重置索引、如何处理空值,从而灵活地将嵌套数据转换为易于分析的扁平结构。它是 Pandas 中非常实用的数据清洗与重塑工具之一。