我有一个3D数据框,我想在z轴上获得一个x,y索引的所有值,这里的z轴在原始2D数据框之间移动。我的想象方式虽然可以原谅我,但如果我弄错了,因为我觉得它有点奇怪,如果我得到x = 0的向量x = 0,y = 0,则为[1、5、5 3]。

因此,我的结果将是一个数据帧,其中df_2d [0] [0]将是字符串“ 1、5、3”,依此类推,取3D数据帧中的所有值。

我有什么方法可以实现这一点而无需遍历每个单元格索引并显式访问值?

数据帧定义为:

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'

最佳答案

使用.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'

关于python - 在“,”上的3D Pandas 数组中连接值,使其成为2D数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55632111/

10-09 18:53