Python: 多维 pandas DataFrame

3

这是我的第一个问题。

我有许多数据集,每个数据集都应该呈现在一个DataFrame中。我试图通过将DataFrame作为多维元组的一个项目来实现,例如:

data[0][1].Glucose.val
data[0][1].Glucose.time

我已经预定义了这个元组,就像这样:

data = tuple([data_type for _ in range(3)] for _ in range(8))

处理这个问题很好,但是如果我尝试用新值来填充df,元组中的所有元素都会被覆盖:

for condition in range(8):
    for index in range(3):
        loop_it = condition + row_mult * index
        exp_setting = expIDs[loop_it]

        tempval = pd.read_csv(f"raw_data/{exp_setting}_Glucose.csv", delimiter="\t")
        rundata[condition][index].DOT.val = tempval.val.values
        rundata[condition][index].DOT.time = tempval.t

我到底做错了什么?

谢谢。

2个回答

1
元组是不可变的,因此您无法替换单个项目而不覆盖整个元组。您可以使用DataFrame列表代替。如果您的DataFrame具有相同的形状,并且所有值都是数字,则还可以使用一个多维NumPy数组来存储所有数据,例如:
import numpy as np

data = np.array([[[1, 2], [3, 4]], 
                 [[5, 6], [7, 8]]]) 

# replace the first item in the second row of the first frame with 9 
data[0, 1, 0] = 9  

print(data)

[[[1 2]
  [9 4]]

 [[5 6]
  [7 8]]]

顺便提一下,早期版本的pandas确实有专门用于3维和4维DataFrame的特殊数据结构,但我想它们被认为是不必要的。也许您可以将数据堆叠到具有两个维度的一个DataFrame中。为此,您可能需要了解pandas的MultiIndex功能。


嗨,阿恩, 谢谢你的回答。 我尝试使用列表和NumPy数组,但结果是相同的:data = np.array([rundata_type for _ in range(3)]) range(3)]}) for _ in range(8)]}) for i in range(3): data[i].DOT.val = [i] print(data[0].DOT.val)''' 输出:0 0 Name: val, dtype: int64 0 1 Name: val, dtype: int64 0 2 Name: val, dtype: int64 ``` - haenser
嗨@haenser,NumPy建议是作为使用列表的替代方案。我在我的答案中添加了一些澄清。 - Arne

0
如下所述:多维类列表 - 覆盖问题 问题在于,我没有正确地初始化类。
错误的做法:
data = tuple([data_type for _ in range(3)] for _ in range(8))

正确:

data = tuple([data_type() for _ in range(3)] for _ in range(8))

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