如何从 pandas 数据框构建直方图,其中每个观察值都是一个列表?

How to build a histogram from a pandas dataframe where each observation is a list?

我有一个数据框如下。这些值位于单元格中,即元素列表。我想使用堆叠成行或按颜色分隔的直方图“S”可视化“值”列中值的分布 (Area_code)。

如何在 plotly 中获取值并构建直方图“S”?任何其他想法也欢迎。谢谢。

    Area_code   Values
0   New_York    [999, 54, 231, 43, 177, 313, 212, 279, 199, 267]
1   Dallas  [915, 183, 2326, 316, 206, 31, 317, 26, 31, 56, 316]
2   XXX     [560]
3   YYY     [884, 13]
4   ZZZ     [203, 1066, 453, 266, 160, 109, 45, 627, 83, 685, 120, 410, 151, 33, 618, 164, 496]

如果您重塑数据,这将是 px.histogram 的完美案例。从那里您可以通过 histfunc 方法在 sum, average, count 等多个输出之间进行选择:

fig = px.histogram(df, x = 'Area_code', y = 'Values', histfunc='sum')
fig.show()

您还没有指定您想要什么样的输出,但我会留给您更改 histfunc 的参数并查看哪个选项最适合您的需求。

我经常倾向于敦促用户重新考虑他们的整个数据流程,但我只是假设有充分的理由让您坚持使用数据框中看起来非常奇怪的设置。下面的代码片段包含一个完整的数据处理过程,用于将您的数据从您的设置中重塑为所谓的 格式:

   Area_code  Values
0   New_York     999
1   New_York      54
2   New_York     231
3   New_York      43
4   New_York     177
5   New_York     313
6   New_York     212
7   New_York     279
8   New_York     199
9   New_York     267
10    Dallas     915
11    Dallas     183
12    Dallas    2326
13    Dallas     316
14    Dallas     206
15    Dallas      31
16    Dallas     317
17    Dallas      26
18    Dallas      31
19    Dallas      56
20    Dallas     316
21       XXX     560
22       YYY     884
23       YYY      13
24       ZZZ     203

对于 plotly.express 的许多强大功能来说,这是一种完美的格式。

完整代码:

import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

# data input
df = pd.DataFrame({'Area_code': {0: 'New_York', 1: 'Dallas', 2: 'XXX', 3: 'YYY', 4: 'ZZZ'},
                 'Values': {0: [999, 54, 231, 43, 177, 313, 212, 279, 199, 267],
                  1: [915, 183, 2326, 316, 206, 31, 317, 26, 31, 56, 316],
                  2: [560],
                  3: [884, 13],
                  4: [203, 1066, 453, 266, 160, 109, 45, 627, 83, 685, 120, 410, 151, 33, 618, 164, 496]}})

# data munging
areas = []
value = []
for i, row in df.iterrows():
#     print(row['Values'])
        for j, val in enumerate(row['Values']):
            areas.append(row['Area_code'])
            value.append(val)
df = pd.DataFrame({'Area_code': areas,
                   'Values': value})

# plotly
fig = px.histogram(df, x = 'Area_code', y = 'Values', histfunc='sum')
fig.show()