【问题标题】:Convert pandas dataframe to list of tuples - ('Row', 'Column', Value)将 pandas 数据框转换为元组列表 - ('Row', 'Column', Value)
【发布时间】:2020-05-28 17:13:37
【问题描述】:

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

我正在尝试使用 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)...]

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以先通过stack进行reshape,然后再转换为tuples:

    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 个单独的arrays 和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))
    

    【讨论】:

    • 哇,也感谢您提供的替代方案,具有 3 个独立数组的第三个选项实际上似乎比其他选项快得多,在我的数据集上,它的运行速度始终比任何一个都快 3-4 倍其他解决方案,包括来自@jpp 的解决方案——所有其他解决方案的运行时间都在约 5.4 毫秒左右,而这个始终以约 1.4 毫秒的速度运行
    【解决方案2】:

    使用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)]
    

    【讨论】:

    • 也感谢您的快速回答,这也很有效,但是 jezrael 的 zip 功能胜过一切(不是说它运行得很慢)
    【解决方案3】:

    使用迭代器和列表理解:

    my_list = []
    for row in df.iterrows():
        my_list.extend([(row[0], i, v) for i, v in row[1].iteritems()])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2021-11-14
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多