gpt4 book ai didi

python - Pandas 中的多键横截面。处理未命中和重复索引

转载 作者:行者123 更新时间:2023-11-28 17:40:32 25 4
gpt4 key购买 nike

在 Pandas 中似乎有三种不同的方式来进行多键横截面:

但是,我无法运行那些线程中描述的解决方案。让我解释一下:

使用 idx 的例子:

假设我想从以下系列中获取与 A 关联的横截面 ['bar', 'flux']:

> my_series

A B
bar one 0.269566
three 1.156823
flux six 0.087296
three -2.652280
foo five 0.216790
one -0.652412
two 0.590229
two -1.570565

如果我这样做:

> idx = pd.IndexSlice
> my_series.to_frame().loc[idx[['bar', 'flux'],:], :]

我得到:

A    B                           
bar one 0.269566
three 1.156823
flux six 0.087296
three -2.652280

这是正确的(它为我提供了 ['bar', 'flux'] 的横截面。

idx 失败的示例(键不存在):

现在,假设我在横截面键列表中包含一个存在的键(例如does_not_exist),我得到:

> my_series.to_frame().loc[idx[['bar', 'does_not_exist'],:], :]

KeyError: 'does_not_exist'

但是,如果我先验地知道 does_not_exist 不存在于级别 A 中怎么办?我怎样才能避免错误并仍然从请求的横截面中获得任何匹配项?我如何正确地预先修剪 key 以确保横截面适用于任何匹配的 key ?

另外,在上面的例子中,使用idx需要通过一个frame吗?如果我尝试直接使用它,我会得到:

> idx = pd.IndexSlice
> my_series[idx[['bar', 'something_else'],:], :]
TypeError:

为什么?

using the "panel" solution 时失败的示例(重复索引) :

相反,如果我尝试 my_series.to_frame().to_panel().ix[:,my_keys, :] 我得到:

ValueError: Can't convert non-uniquely index DataFrame to Panel

但我认为我可以使用 this answer 中描述的“转换为面板” 解决方案得到横截面。为什么会失败?

附录:

为了创建我在帖子顶部作为示例包含的随机系列,我使用了:

def create_random_multi_index():
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'flux', 'foo', 'flux'],
'B' : ['one', 'one', 'two', 'three',
'two', 'six', 'five', 'three'],
'C' : randn(8), 'D' : randn(8), 'E': randint(0,3, size=(8,))})
df.set_index(['A', 'B'], inplace=True)
df.sort_index(inplace=True)
return df

然后我做了(例如):

my_series = create_random_multi_index['C']

或者,您可以使用:

s = Series(np.arange(9),index=pd.MultiIndex.from_product([['A','B','C'],['foo','bar','baz']],names=['one','two'])).sortlevel()

最佳答案

我认为这可能是 API 问题,请参见此处:https://github.com/pydata/pandas/issues/7866 .我认为这可以而且应该起作用。

创建样本数据。通常确保它是 lexsorted。

In [17]: s = Series(np.arange(9),index=pd.MultiIndex.from_product([['A','B','C'],['foo','bar','baz']],names=['one','two'])).sortlevel()

In [21]: s
Out[21]:
one two
A bar 1
baz 2
foo 0
B bar 4
baz 5
foo 3
C bar 7
baz 8
foo 6
dtype: int64

常规选择。如果未找到值,将引发 KeyError

In [18]: s.loc[idx[:,'foo']]
Out[18]:
one
A 0
B 3
C 6
dtype: int64

使用 mask 进行选择。这里的掩码是一个 bool 数组,无论值是否存在。

In [19]: s.loc[idx[:,s.index.get_level_values('two').isin(['foo','bah'])]]
Out[19]:
one two
A foo 0
B foo 3
C foo 6
dtype: int64

简单地重建索引可能更容易。

In [20]: s.reindex(['foo','bah'],level='two')
Out[20]:
one two
A foo 0
B foo 3
C foo 6
dtype: int64

关于python - Pandas 中的多键横截面。处理未命中和重复索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006197/

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