如果pandas dataframe.loc位置不存在,则返回default

fan*_*ous 23 python pandas

我发现在尝试引用它之前,我经常需要检查数据框中是否存在列或行.例如,我最终添加了许多代码,如:

if 'mycol' in df.columns and 'myindex' in df.index: x = df.loc[myindex, mycol]
else: x = mydefault
Run Code Online (Sandbox Code Playgroud)

有没有办法更好地做到这一点?例如,在我可以做的任意对象上x = getattr(anobject, 'id', default)- 在熊猫中有类似的东西吗?真的有办法实现我正在做的更优雅吗?

EdC*_*ica 32

有一种方法Series:

所以你可以这样做:

df.mycol.get(myIndex, NaN)
Run Code Online (Sandbox Code Playgroud)

例:

In [117]:

df = pd.DataFrame({'mycol':arange(5), 'dummy':arange(5)})
df
Out[117]:
   dummy  mycol
0      0      0
1      1      1
2      2      2
3      3      3
4      4      4

[5 rows x 2 columns]
In [118]:

print(df.mycol.get(2, NaN))
print(df.mycol.get(5, NaN))
2
nan
Run Code Online (Sandbox Code Playgroud)

  • 当已知索引存在时,我也能够使它工作:`df.loc ['myindex'].get('mycol',NaN)`遗憾的是你还需要确定其中一个索引或列存在,但是在很多场景中这将是有用的.谢谢! (3认同)

Foo*_*Bar 12

Python有这种心态要求宽恕而不是许可.你会发现很多关于此事的帖子,我偶然发现了现在的第一个就是这一个.

也就是说,在你的例子中它可能会

try:
    x = df.loc['myindex', 'mycol']
except KeyError:
    x = mydefault
Run Code Online (Sandbox Code Playgroud)

我现在不能运行Pandas所以我不确定它究竟是一个IndexError,但我相信如此.

  • 也许我应该使用更多的 EAFP,但我个人的偏好是在没有其他简单选择的情况下保存 try/excepts。不过谢谢。 (3认同)
  • @Foobar:根据这个[链接](/sf/ask/176540381/),只有“try:”是便宜的。` except:` 似乎很贵。这个故事的寓意似乎是,调用者必须在测试是否存在或“尝试:例外:”之间做出决定。性能权衡取决于您的用例。即测试存在性需要多长时间与不测试会“引发”多少次。尽管如此,如果 pandas 通过允许参数驱动的选择来提供语法糖,那就太好了。据我所知,事实并非如此。 (3认同)