Convert pandas dataframe to list of tuples - ('Row', 'Column', Value)

后端 未结 3 1506
谎友^
谎友^ 2021-01-07 12:17

There are a few other questions regarding the same subject, but the format desired is different in all.

I am trying to build a heatmap visualization using holoviews

相关标签:
3条回答
  • 2021-01-07 12:49

    Using 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}}
    

    Then via a list comprehension:

    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)]
    
    0 讨论(0)
  • 2021-01-07 13:01

    With iterators and list comprehention:

    my_list = []
    for row in df.iterrows():
        my_list.extend([(row[0], i, v) for i, v in row[1].iteritems()])
    
    0 讨论(0)
  • 2021-01-07 13:12

    You can reshape first by stack and then convert to tuples:

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

    Another similar solution is create 3 levels MultiIndex:

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

    Or zip 3 separately arrays with numpy.repeat, numpy.tile and ravel:

    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))
    
    0 讨论(0)
提交回复
热议问题