用Python从数据框构建3D矩阵

3

我是Python的新手,有一个相当基础的问题。

我想重新排列这个数据框:

df = pd.DataFrame({
  "sm1_wf1": [6, 6.1, 5.9, 6],
  "sm1_wf2": [7, 7.1, 6.9, 7],
  "sm2_wf1": [13, 12.9, 13.1, 13]
  "sm1_wf2":[4, 3.9, 4.1, 4]})

使每行变成一个2x2矩阵(行名为sm1和sm2,列名为wf1和wf2),并且总共有四个2x2矩阵(一个用于原始df中的每一行)。 我知道这可以手动完成,但由于实际数据有许多观测值,因此我希望有一种更有效的方法。

请问有人可以向我展示如何做吗?非常感谢。

1个回答

1

从您的问题中并不清楚您希望以何种格式呈现这些2x2矩阵,但以下是一种可能的方法:

df = pd.DataFrame({
  "sm1_wf1": [6, 6.1, 5.9, 6],
  "sm1_wf2": [7, 7.1, 6.9, 7],
  "sm2_wf1": [13, 12.9, 13.1, 13],
  "sm2_wf2": [4, 3.9, 4.1, 4]  # <-- note I changed this column name
})

# Keep original index to keep 2x2 matrices distinct
df = df.reset_index().melt("index")

# Split smX_wfY into two columns sm and wf, then join back onto data
labels = df.pop("variable").str.split("_", expand=True)
labels.columns = ["sm", "wf"]
df = labels.join(df)

# Restructure to 2x2 matrices
df.pivot_table("value", ["index", "sm"], "wf")

这将会得到:
wf          wf1  wf2
index sm            
0     sm1   6.0  7.0
      sm2  13.0  4.0
1     sm1   6.1  7.1
      sm2  12.9  3.9
2     sm1   5.9  6.9
      sm2  13.1  4.1
3     sm1   6.0  7.0
      sm2  13.0  4.0

谢谢你的帮助,很抱歉回复晚了。我尝试了你的解决方案,发现结果矩阵的维度为2。我知道可能我没有清楚表达我的问题,但是如何将其变成2x2x4矩阵而不是2x8呢?再次感谢。 - Allen997
1
使用pandas,数据以二维方式表示。如果您正在使用更高维度的矩阵,则建议直接使用numpy进行操作,因为pandas是基于numpy构建的。要访问数据框下的numpy数组,请使用.values。例如,要将最后一步中的数据转换为具有指定维度的矩阵,请尝试df.values.reshape((2, 2, 4))。如果您想要带有pandas索引的numpy功能,我还建议查看xarray包。 - C. Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接