【问题标题】:Create pandas MultiIndex DataFrame from multi dimensional np arrays从多维 np 数组创建 pandas MultiIndex DataFrame
【发布时间】:2021-01-29 20:42:59
【问题描述】:

我正在尝试将 72 个维度为 (24,12) 的矩阵从一个 np 数组插入到一个预先存在的 MultiIndexDataFrame 中,该 MultiIndexDataFrame 根据一个维度为 (72,2) 的 np.array 进行索引。我不在乎索引矩阵(24,12)的内容,我只需要索引 72 矩阵,即使作为对象用于重新排列目的。它就像一张地图,可以根据某些条件重新排序,然后取消堆叠列。

到目前为止我尝试过的是:

cosphi.shape

(72, 2)

MFPAD_RCR.shape

(72, 24, 12)

df = pd.MultiIndex.from_arrays(cosphi.T, names=("costheta","phi"))

我成功创建了一个包含 72 个索引行的 2 列 DataFrame。然后我尝试添加 72 个矩阵

df1 = pd.DataFrame({'MFPAD':MFPAD_RCR},index=df)

或者可能

df1 = pd.DataFrame({'MFPAD':MFPAD_RCR.astype(object)},index=df)

我得到了错误

Exception: Data must be 1-dimensional. 

有什么想法吗?

【问题讨论】:

标签: pandas dataframe multi-index


【解决方案1】:

经过仔细研究,我发现我的问题has been already answered here(正确答案)和here(使用已弃用函数的解决方案)。

对于我的具体问题,答案是这样的:

data = MFPAD_RCR.reshape(72, 288).T
df = pd.DataFrame(
    data=data,
    index=pd.MultiIndex.from_product([phiM, cosM],names=["phi","cos(theta)"]),
    columns=['item {}'.format(i) for i in range(72)]
)

注意:3D np 数组必须重新整形,第二维等于主要索引和次要索引的乘积。

df1 = df.T

我希望能够根据来自 cosphi 的额外索引对我的项目(也称为矩阵)进行排序

cosn=np.array([col[0] for col in cosphi]); #list
phin=np.array([col[1] for col in cosphi]); #list

注意:新索引的长度必须与项目(矩阵)= 72 相同

df1.set_index(cosn, "cos_ph", append=True, inplace=True)
df1.set_index(phin, "phi_ph", append=True, inplace=True)

然后这个就可以排序了

df1.sort_index(level=1, inplace=True, kind="mergesort")

重塑

outarray=(df1.T).values.reshape(24,12,72).transpose(2, 0, 1)

欢迎任何使代码更快/更漂亮的建议!

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 2021-12-13
    • 2021-02-20
    • 2023-04-08
    • 2019-03-12
    • 2019-02-08
    • 2021-03-08
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多