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

Polars展开DataFrame列后,如何保持总时长不重复并保留分组?

解决方法

问题核心是explode后每个订阅者对应多条数据,每条的total_duration都是原值,堆叠条形图会把这些值叠加,导致总时长翻倍。下面给两种可行方案:

方案一:均分总时长,堆叠后保持原值

先给每个订阅者计算互动类型的数量,再把总时长均分到每个互动条目上,这样堆叠后的总高度和原时长一致,同时保留所有互动分组的图例:

import polars as pl
import plotly.express as px

# 原始数据
df = pl.DataFrame({
    "sub_id": [1,2,3], 
    "engagement": ["one:one,two:two", "one:two,two:one", "one:one"], 
    "total_duration": [123, 456, 789]
})

# 拆分并计算每个互动条目的均分时长
df_exploded = (
    df
    .with_columns(pl.col("engagement").str.split(","))
    # 计算每个订阅者的互动类型数量
    .with_columns(pl.col("engagement").list.len().alias("eng_count"))
    .explode("engagement")
    # 总时长均分至每个互动条目
    .with_columns((pl.col("total_duration") / pl.col("eng_count")).alias("duration_per_eng"))
)

# 绘制堆叠条形图
fig = px.bar(
    df_exploded, 
    x="sub_id", 
    y="duration_per_eng", 
    color="engagement", 
    barmode="stack",
    title="订阅者总时长(按互动类型均分)"
)
fig.show()

方案二:分组并排显示,不叠加时长

如果不需要展示占比,只是想保留每个订阅者的原时长,同时展示对应的所有互动类型,可使用分组条形图(barmode="group"),让同一订阅者的不同互动条并排显示,避免叠加:

# 直接使用explode后的数据集
df_exploded = df.with_columns(pl.col("engagement").str.split(",")).explode("engagement")

# 绘制分组条形图
fig = px.bar(
    df_exploded, 
    x="sub_id", 
    y="total_duration", 
    color="engagement", 
    barmode="group",
    title="订阅者总时长(按互动类型分组)"
)
fig.show()

内容的提问来源于stack exchange,提问作者Igor Lazarev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:56