Pandas - 元组列表的数据框 - ('Row','Column',Value)

时间:2018-05-24 09:26:13

标签: python pandas dataframe

关于同一主题还有一些其他问题,但所需的格式完全不同。

我正在尝试使用holoviews and bokeh

构建热图可视化

我的数据作为excel文件被读入数据框,其内容如下:

    Foo    Bar    Bash    Baz   ...
A   1      2      3       4
B   2      1      0       3
C   0      0      2       0
D   2      3      5       1
...

文档说The data for a HeatMap may be supplied as 2D tabular data with one or more associated value dimensions.

绘制数据框本身不起作用,我觉得我需要将我的数据转换为如下形式:

[('A', 'Foo', 1), ('A', 'Bar', 2), ('A', 'Bash', 3), ('A', 'Baz', 4), ('B', 'Foo', 1)...]

有没有比手动迭代整个数据框并手动构建它更快的方法呢?

3 个答案:

答案 0 :(得分:1)

您可以先stack重新整形,然后转换为tuple s:

tups = [tuple(x) for x in df.stack().reset_index().values.tolist()]

另一个类似的解决方案是创建3个级别MultiIndex

tups = df.stack().to_frame().set_index(0, append=True).index.tolist()

zip 3 array分别numpy.repeatnumpy.tileravel

a = np.repeat(df.index, len(df.columns))
b = np.tile(df.columns, len(df))
c = df.values.ravel()

tups = list(zip(a,b,c))

答案 1 :(得分:1)

使用pd.DataFrame.to_dict

res = df.to_dict('index')

{'A': {'Bar': 2, 'Bash': 3, 'Baz': 4, 'Foo': 1},
 'B': {'Bar': 1, 'Bash': 0, 'Baz': 3, 'Foo': 2},
 'C': {'Bar': 0, 'Bash': 2, 'Baz': 0, 'Foo': 0},
 'D': {'Bar': 3, 'Bash': 5, 'Baz': 1, 'Foo': 2}}

然后通过列表理解:

lst = [(k, a, b) for k, v in res.items() for a, b in v.items()]

[('A', 'Foo', 1),
 ('A', 'Bar', 2),
 ('A', 'Bash', 3),
 ...
 ('D', 'Baz', 1)]

答案 2 :(得分:0)

具有迭代器和列表理解功能:

format