gpt4 book ai didi

python - 如何正确使用带有包含间隔的多索引的 Pandas Dataframe?

转载 作者:太空狗 更新时间:2023-10-30 01:47:42 32 4
gpt4 key购买 nike

我正在尝试切入具有由 IntervalIndex 和常规索引组成的 MultiIndex 的 DataFrame。示例代码:

from pandas import Interval as ntv

df = pd.DataFrame.from_records([
{'id': 1, 'var1': 0.1, 'ntv': ntv(0,10), 'E': 1},
{'id':2, 'var1': 0.5, 'ntv': ntv(0,12), 'E': 0}
], index=('ntv', 'id'))

看起来像这样:

            E  var1
ntv id
(0, 10] 1 1 0.1
(0, 12] 2 0 0.5

我想做的是在特定值处切入 DataFrame 并返回具有包含该值的间隔的所有行。例如:

df.loc[4]

应该返回(平凡地)

    E  var1
id
1 1 0.1
2 0 0.5

问题是我不断收到关于索引的 TypeErrordocs展示了一个类似的操作(但在单级索引上),它确实产生了我正在寻找的东西。

TypeError: only integer scalar arrays can be converted to a scalar index

我试过很多东西,似乎没有什么能正常工作。我可以在数据帧中包含 id 列,但我宁愿保持我的索引唯一,而且我会不断调用 set_index('id')

我觉得要么 a) 我遗漏了有关 MultiIndexes 的某些内容,要么 b) 在 MultiIndex 中使用 IntervalIndex 时存在错误/歧义。

最佳答案

因为我们说的是区间,所以有一个名为 get_loc 的方法可以找到区间之间具有值的行。说出我的意思:

from pandas import Interval as ntv

df = pd.DataFrame.from_records([
{'id': 1, 'var1': 0.1, 'ntv': ntv(0,10), 'E': 1},
{'id':2, 'var1': 0.5, 'ntv': ntv(0,12), 'E': 0}
], index=('ntv', 'id'))

df.iloc[(df.index.get_level_values(0).get_loc(4))]
E var1
ntv id
(0, 10] 1 1 0.1
(0, 12] 2 0 0.5

df.iloc[(df.index.get_level_values(0).get_loc(11))]
E var1
ntv id
(0, 12] 2 0 0.5

如果您在一个时间间隔内有多行数据,这也适用,即

df = pd.DataFrame.from_records([
{'id': 1, 'var1': 0.1, 'ntv': ntv(0,10), 'E': 1},
{'id': 3, 'var1': 0.1, 'ntv': ntv(0,10), 'E': 1},
{'id':2, 'var1': 0.5, 'ntv': ntv(0,12), 'E': 0}
], index=('ntv', 'id'))

df.iloc[(df.index.get_level_values(0).get_loc(4))]

E var1
ntv id
(0, 10] 1 1 0.1
3 1 0.1
(0, 12] 2 0 0.5

如果你用列表理解来计时,这种方法对于大型数据帧来说更快,即

ndf = pd.concat([df]*10000)

%%timeit
ndf.iloc[ndf.index.get_level_values(0).get_loc(4)]
10 loops, best of 3: 32.8 ms per loop

%%timeit
intervals = ndf.index.get_level_values(0)
mask = [4 in i for i in intervals]
ndf.loc[mask]
1 loop, best of 3: 193 ms per loop

关于python - 如何正确使用带有包含间隔的多索引的 Pandas Dataframe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47621886/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com