【问题标题】:return default if pandas dataframe.loc location doesn't exist如果 pandas dataframe.loc 位置不存在,则返回默认值
【发布时间】:2014-06-17 16:11:43
【问题描述】:

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

if 'mycol' in df.columns and 'myindex' in df.index: x = df.loc[myindex, mycol]
else: x = mydefault

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Series的方法:

    所以你可以这样做:

    df.mycol.get(myIndex, NaN)
    

    例子:

    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
    

    【讨论】:

    • 当已知索引存在时,我也能够让它工作:df.loc['myindex'].get('mycol', NaN) 遗憾的是,您仍然需要确保索引或列之一存在,但这仍然会在很多场景中都很有用。谢谢!
    【解决方案2】:

    Python 有这种请求宽恕而不是许可的心态。你会发现很多关于这个问题的帖子,比如this one

    在 Python 中,捕获异常的成本相对较低,因此我们鼓励您使用它。这称为EAFP 方法。

    例如:

    try:
        x = df.loc['myindex', 'mycol']
    except KeyError:
        x = mydefault
    

    【讨论】:

    • 也许我应该使用更多的 EAFP,但我个人的偏好是在没有其他简单选择时保存 try/excepts。不过还是谢谢。
    • @Foobar:根据这个link,只有try: 便宜。 except: 似乎很贵。这个故事的寓意似乎是让调用者在测试是否存在或try: except:ing 之间做出决定。性能权衡取决于您的用例。即测试存在需要多长时间与不测试多少次raise。尽管如此,如果 pandas 通过允许参数驱动的选择来提供语法糖,那就太好了。据我所知,它没有。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2018-12-12
    • 2013-09-10
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多