Объединение значений в массиве трехмерных панд в «,», превращение в двумерный массив - PullRequest
1 голос
/ 11 апреля 2019

У меня есть 3D-кадр данных, и я хочу получить все значения одного индекса x, y по оси z, где ось z здесь перемещается между исходными 2D-кадрами. То, как я могу себе это представить, хотя простите меня, если я ошибаюсь, потому что это немного странно визуализировать, если бы я получил вектор x, y из x = 0, y = 0, это было бы [1, 5, 3].

Таким образом, мой результат будет кадром данных, где df_2d [0] [0] будет строкой "1, 5, 3" и т. Д., Принимая все значения в трехмерном кадре данных.

Есть ли способ, которым я могу достичь этого, не просматривая каждый индекс ячейки и не обращаясь к значениям явно?

Фрейм данных определяется как:

import pandas as pd

columns = ['A', 'B']
index = [1, 2, 3]

df_1 = pd.DataFrame(data=[[1, 2], [99, 57], [57, 20]], index=index, columns=columns)
df_2 = pd.DataFrame(data=[[5, 6], [78, 47], [21, 11]], index=index, columns=columns)
df_3 = pd.DataFrame(data=[[3, 4], [66, 37], [33, 17]], index=index, columns=columns)

df_3d = pd.concat([df_1, df_2, df_3], keys=['1', '2', '3'])

А затем, чтобы получить исходные данные, я делаю:

print(df_3d.xs('1'))

print(df_3d.xs('2'))

print(df_3d.xs('3'))



    A   B
1   1   2
2  99  57
3  57  20

    A   B
1   5   6
2  78  47
3  21  11

    A   B
1   3   4
2  66  37
3  33  17

Опять же, чтобы уточнить, если смотреть на этот отпечаток, я бы хотел, чтобы комбинированный кадр данных выглядел следующим образом:

    A              B
1  '1, 5, 3'     '2, 6, 4'
2  '99, 78, 66'  '57, 47, 37'
3  '57, 21, 33'  '20, 11, 17'

1 Ответ

0 голосов
/ 11 апреля 2019

Используйте .xs для получения каждого уровня данных и reduce для объединения всех данных.

from functools import reduce

# Get each level values
dfs = [df_3d.xs(i) for i in df_3d.index.levels[0]]

df = reduce(lambda left,right: left.astype(str) + ", " + right.astype(str), dfs)

df
            A           B
1     1, 5, 3     2, 6, 4
2  99, 78, 66  57, 47, 37
3  57, 21, 33  20, 11, 17

И если вы хотите ', вы можете использовать applymap, чтобы применить функцию к каждому элементу.

df.applymap(lambda x: "'" + x + "'")

              A             B
1     '1, 5, 3'     '2, 6, 4'
2  '99, 78, 66'  '57, 47, 37'
3  '57, 21, 33'  '20, 11, 17'

Или df = "'" + df + "'"

df
              A             B
1     '1, 5, 3'     '2, 6, 4'
2  '99, 78, 66'  '57, 47, 37'
3  '57, 21, 33'  '20, 11, 17'
...