Python/Pandas:如何创建多索引空数据帧,然后开始填充它?
我想使用Python/Pandas:如何创建多索引空数据帧,然后开始填充它?,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我想使用pd.MultiIndex将本地数据帧集的摘要存储到“元数据帧”中 基本上,行轴有两个级别,列轴也有。 在管理数据帧集的类中,我将这个“元数据帧”定义为类变量 它似乎起作用了 MD.index >>> MultiIndex([], names=['Data', 'Period']) MD.columns >>> MultiIndex([], names=['Data', 'Extrema']) 现在,每次我处理一个单独的数据帧id,我都想相应地更新
pd.MultiIndex
将本地数据帧集的摘要存储到“元数据帧”中
基本上,行轴有两个级别,列轴也有。
在管理数据帧集的类中,我将这个“元数据帧”定义为类变量
它似乎起作用了
MD.index
>>> MultiIndex([], names=['Data', 'Period'])
MD.columns
>>> MultiIndex([], names=['Data', 'Extrema'])
现在,每次我处理一个单独的数据帧id
,我都想相应地更新这个“元数据帧”<代码>id有一个日期时间索引,其周期为“5m”
id.index[0]
>>> Timestamp('2020-01-01 08:00:00')
id.index[-1]
>>> Timestamp('2020-01-02 08:00:00')
例如,我想在MD中保留它的第一个和最后一个索引值
MD.loc[[('id', '5m')],[('Timestamp', 'First')]] = id.index[0]
MD.loc[[('id', '5m')],[('Timestamp', 'Last')]] = id.index[-1]
这不起作用,我收到以下错误消息:
TypeError: unhashable type: 'list'
最后,我希望在MD中有以下类型的信息(我有其他id
DataFrames,时间段不同):
最后,我还将保留id
中某些列的最小值和最大值。
例如,如果id
有一列“温度”
Timestamp Temperature
First Last Min Max
id 5m 2020-01-01 08:00:00 2020-01-02 08:00:00 -2.5 10
10m 2020-01-05 08:00:00 2020-01-06 18:00:00 4 15
当我记录id
时,将记录这些值
我知道每个单元初始化一个数据帧单元的时间效率不高,但不会经常这样做
此外,我不知道如何在Dict中管理这种信息组织,这就是我考虑使用多级数据帧的原因。
然后我会将其转储到csv文件中,以存储这些“元数据”
请问,在MD中初始化这些值的正确方法是什么
谢谢你的帮助!
最好,您可以将数据存储在一个dict of dict中,而不是填充一个空数据框。多索引使用
元组
作为索引值,因此我们制作每个字典元组的键
外部字典使用列多索引元组作为键,值是另一个字典,行多索引元组作为键,单元格中的值作为值
d = {('Score', 'Min'): {('id1', '5m'): 72, ('id1', '10m'): -18},
('Timestamp', 'First'): {('id1', '5m'): 1, ('id1', '10m'): 2},
('Timestamp', 'Last'): {('id1', '5m'): 10, ('id1', '10m'): 20}}
# | | |
# Column MultiIndex Row Multi Cell Value
# Label Label
pd.DataFrame(d)
创建
dict
将取决于如何获取值。你可以MD.loc[('id','5m'),('Timestamp','First')]=id.index[0]
?谢谢,但对我来说不起作用。对你有用吗?我有一个ValueError:名字应该是多索引邮件的列表。感谢您的支持Alolz,但是,我不知道如何处理您的建议。我一个接一个地得到价值。所以,即使我可以按照你对第一个值的建议去做,那么当我有第二个值要管理,并且我已经将dict转换成了一个数据帧时,我该如何更新数据帧呢?实际上,我回到了我最初的问题:如何在多索引数据框中添加和/或修改单元格。@pierre_j不知道如何获得这些单独的值是很困难的。但是dict应该与MultiIndex没有什么不同。例如,从d={}
开始,您可以添加一个值,如d[('Score','Min')]={('id','5m'):72}
。然后,如果需要添加另一行,您可以执行类似于d[('Score','min')].update({('id','10m'):5})
的操作,理想情况下,您不必每次都键入这一行,而是可以通过编程方式引用行和列的多索引标签,这样可以在非常少的行中构建dict,如果这些数据来自不同的数据帧,那么可能有一种更简单的方法来获取您需要的所有信息,然后您可以使用键来标记所有信息。同样,这一切都需要事先进行一点深思熟虑的组织,以保持事情的可管理性和自命名性。每当我在文件中记录单个数据帧时,就会更新此多索引数据帧。如果我在一个文件中记录一个单独的数据帧,那是因为我创建了它,或者扩展了它。此时,我希望保留在多索引数据框中的值可能已更改(例如,最后一个DateTimeIndex值,或列的最小值或最大值),因此此时,我需要在多索引数据框中添加新值,或修改现有值。我没有一次获得所有值。多索引数据帧是存储“活动”数据的一种方法
Timestamp Temperature
First Last Min Max
id 5m 2020-01-01 08:00:00 2020-01-02 08:00:00 -2.5 10
10m 2020-01-05 08:00:00 2020-01-06 18:00:00 4 15
d = {('Score', 'Min'): {('id1', '5m'): 72, ('id1', '10m'): -18},
('Timestamp', 'First'): {('id1', '5m'): 1, ('id1', '10m'): 2},
('Timestamp', 'Last'): {('id1', '5m'): 10, ('id1', '10m'): 20}}
# | | |
# Column MultiIndex Row Multi Cell Value
# Label Label
pd.DataFrame(d)
Score Timestamp
Min First Last
id1 5m 72 1 10
10m -18 2 20