首页 > 解决方案 > 如何从带有列表的 pandas DataFrame 创建一个绘图线图

问题描述

我有一个从 dict 创建的 pandas DataFrame,并想从中创建一个情节线图。然而,DataFrame 包含列表,如下所示:

                    a  ...                   L
0                 a_0  ...  [L_00,       L_01]
1                 a_1  ...  [L_10,       L_11]
2                 a_2  ...  [L_20,       L_21]
3                 a_3  ...  [L_30,       L_31]

我的情节应该是L_i0plotted against的值,a_i但我只能创建给出这样的列名称的情节:

fig = px.line(dataframe, x='a', y='L')

我知道我可以访问这样的值['L'][i][0],然后遍历 i 但是否可以告诉 plotly 只取列表 L 的第一个值?

示例数据框

df = pd.DataFrame({'a':[1,2,3],
                   'L':[[10,11,12], [20,21,22], [30,31,21]]})

标签: pythonpandasdataframeplotlyplotly-dash

解决方案


我不明白为什么,但如果事实上你是正确的

[...] 只能创建给出这样的列名称的图

那么你真的应该考虑确保它df['L']实际上只包含你想要绘制的值,而不是与一堆其他东西一起列出。但是您很可能有充分的理由完全按照您的方式组织数据,所以我怀疑您的问题实际上是XY 问题

但是,如果您不一定要使用plotly.express,那么plotly.graph_objects可以完全按照您在此处使用的目标来做,除其他外, df.iterrows(). 我假设这个数据结构类似于你的真实世界场景:

   a        L
0  1  [10, 11, 12]
1  2  [20, 21, 22]
2  3  [30, 31, 21]

代码:

import pandas as pd
import plotly.graph_objects as go

df = pd.DataFrame({'a':[1,2,3],
                   'L':[[10,11,12], [20,21,22], [30,31,21]]})

aVals = []
LVals = []
for i, row in df.iterrows():
    aVals.append(row[0])
    LVals.append(row[1][0])
    
fig = go.Figure(go.Scatter(x=aVals, y=LVals))
fig.show()

阴谋:

在此处输入图像描述


推荐阅读