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
相关产品推荐
相关产品推荐

