Pandas是否有类似dplyr list columns的功能?
Pandas 中实现 dplyr 列表列(list columns)功能的方法
Pandas 原生支持列表列能力,不需要依赖额外扩展库,单元格可以存储任意Python对象(包括列表、数组、自定义类实例等),完全覆盖dplyr列表列的使用场景。
创建列表列
- 直接构造:初始化DataFrame时直接传入存了列表的序列即可,示例代码:
import pandas as pd # 手动构造带列表列的DataFrame df = pd.DataFrame({ "tag": ["fruits", "meats", "drinks"], "items": [["apple", "banana"], ["pork", "beef", "chicken"], ["coke", "sprite"]] })
- 分组聚合生成:和dplyr中分组后将同组值聚合为列表的逻辑一致,用groupby配合agg即可生成:
# 原始长表 raw_df = pd.DataFrame({ "user_id": [1,1,2,2,2,3], "order_id": [101,102,201,202,203,301] }) # 按用户分组,把所有订单id聚合成列表列 user_order_df = raw_df.groupby("user_id", as_index=False)["order_id"].agg(list)
列表列核心操作
- 展开列表列(对应tidyr::unnest):使用
explode方法,把列表中每个元素拆分为独立行,自动对齐其他列的值:
# 将订单列表列展开,回到原始长表结构 user_order_df.explode("order_id")
- 逐元素处理列表列(对应purrr::map系列):用
apply方法传入自定义函数,即可对每个单元格内的列表做任意计算:
# 计算每个用户的订单数、订单号首尾值 user_order_df = user_order_df.assign( order_count = user_order_df["order_id"].apply(len), first_order = user_order_df["order_id"].apply(lambda x: x[0]), last_order = user_order_df["order_id"].apply(lambda x: x[-1]) )
- 嵌套生成列表列(对应tidyr::nest):除了分组聚合的方式,也可以按字段分组后将子表直接存入列,实现和dplyr嵌套数据框完全一致的效果:
# 按用户分组,将每个用户的订单子表存入nested_data列 nested_df = raw_df.groupby("user_id").apply( lambda g: g[["order_id"]].to_dict("records") ).reset_index(name="nested_data")
使用注意
列表列存储的是通用Python对象,运算效率比pandas原生的数值、datetime、category等结构化类型低,仅在需要存储变长、非结构化嵌套数据时使用,大规模数值计算场景优先选择标准结构化列类型。
内容的提问来源于stack exchange,提问作者Rafael Peixoto
相关产品推荐
相关产品推荐

