gpt4 book ai didi

python - 具有多索引的 df.at 与 df.loc

转载 作者:行者123 更新时间:2023-12-03 17:33:56 25 4
gpt4 key购买 nike

我有一个关于 df.loc 之间差异的问题和 df.at关于具有 MultiIndex 的数据帧。我一直在查看来自 stackoverflow 的一些精彩资源,但它似乎并没有阐明我的问题。特别是这个... pandas .at versus .loc (或者至少我不完全理解这里显示的内容)。

根据 Pandas 文档,https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DataFrame.at.html , df.at应该返回奇异值,它比 df.loc 快,所以我倾向于使用 df.at .让我展示我的困惑,因为它适用于使用 df.at带有多索引。

我有以下数据框:

df = pd.DataFrame({'field1':['foo']*6, 'field2':['bar']*6, 'field3': 
['a','a','b','b','b','c'],'value1':[0.4,0.5,0.4,0.7,.9,.4],'value2':
[4000,4000,9000,9000,9000,10000]}, index=range(6))

df
Out[329]:
field1 field2 field3 value1 value2
0 foo bar a 0.4 4000
1 foo bar a 0.5 4000
2 foo bar b 0.4 9000
3 foo bar b 0.7 9000
4 foo bar b 0.9 9000
5 foo bar c 0.4 10000

我想使用 MultiIndex 访问此数据框,因此我正在执行以下操作:
df = df.set_index(['field1','field2','field3'])

所以现在我想访问 value1在我的 df('foo','bar','c')这是一个奇异值,它会出错。
df.at[('foo','bar','c'),'value1']
Traceback (most recent call last):

File "<ipython-input-344-921b8b658a49>", line 1, in <module>
df.at[('foo','bar','c'),'value1']

File "C:\Anaconda2\lib\site-packages\pandas\core\indexing.py", line 1610,
in __getitem__
return self.obj.get_value(*key, takeable=self._takeable)

File "C:\Anaconda2\lib\site-packages\pandas\core\frame.py", line 1836, in
get_value
return engine.get_value(series.get_values(), index)

File "pandas\index.pyx", line 103, in pandas.index.IndexEngine.get_value
(pandas\index.c:3234)

File "pandas\index.pyx", line 111, in pandas.index.IndexEngine.get_value
(pandas\index.c:2931)

File "pandas\index.pyx", line 152, in pandas.index.IndexEngine.get_loc
(pandas\index.c:3830)

File "pandas\index.pyx", line 170, in
pandas.index.IndexEngine._get_loc_duplicates (pandas\index.c:4154)

TypeError: only integer arrays with one element can be converted to an index

我假设这是返回一个不能表示单个值的系列对象?鉴于 df.loc 的输出,这只是我的假设.
df.loc[('foo','bar','c')]['value1']
Out[345]:
field1 field2 field3
foo bar c 0.4
Name: value1, dtype: float64

现在如果我没有使用 MultiIndex,我认为这个问题不会出现......

无论如何,这是否有问题,或者我显然遗漏了什么?谢谢

最佳答案

你可以尝试这样的事情:

# setting multiindex
df = df.set_index(['field1','field2','field3'])
现在当您使用 df.at像这样: df.at[('foo','bar','c')]['value1'] ,你会得到想要的结果:
field1  field2  field3
foo bar c 0.4
Name: value1, dtype: float64
根据我的尝试,您可能没有使用 at 查询数据框正确。

关于python - 具有多索引的 df.at 与 df.loc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800835/

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