Pandas - датафрейм в список кортежей - ('Row', 'Column', Value) - PullRequest
0 голосов
/ 24 мая 2018

Есть несколько других вопросов, касающихся той же темы, но желаемый формат отличается во всех.

Я пытаюсь построить визуализацию тепловой карты, используя holoviews и 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)...]

Есть ли более быстрый способ сделать это, чем выполнять ручную итерацию по всему фрейму данных и создавать его вручную?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Использование 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)]
0 голосов
/ 24 мая 2018

Вы можете сначала изменить форму на 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.repeat, numpy.tile и 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...