You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:06:27