【问题标题】:Pandas: `item` has been deprecated熊猫:`item` 已被弃用
【发布时间】:2019-12-14 20:27:39
【问题描述】:

到目前为止,我在这里使用了这行代码:

max_total_gross = event_data["max_total_gross"].loc[event_data["event_id"] == event_id].item()

自从我更新 Pandas 后,我收到了未来的警告:

/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:12: FutureWarning:item 已被弃用,将在 未来版本如果 sys.path[0] == '':

我试图用这种方式修复它,但结果不一样:

event_data.loc[event_data.event_id == event_id, 'max_total_gross']

我期望一个整数。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果需要第一个匹配值使用iter和next,优点是如果没有匹配的值返回默认值:

    s = event_data.loc[event_data.event_id == event_id, 'max_total_gross']
    
    out = next(iter(s), 'no match')
    print (out)
    

    【讨论】:

    • 如果我需要进一步计算(不仅仅是打印),next/iter 是否也是处理该数据的正确方法?稍后在我的代码中,我会使用event_orders["y"] = event_orders["total_gross_cumsum"] / (max_total_gross * 100)。我期望更多像 s[0] (不起作用)这样的方式来访问该值。 next/iter 永远不会出现在我的脑海中。
    • 我做了更多的试验,发现这里也能正常工作:max_total_gross = event_data.loc[ event_data["event_id"] == event_id, "max_total_gross" ].values[0]你觉得用什么更好?
    • @JoeyCoder - 你的解决方案很好,如果总是匹配至少一个值。如果没有,如果失败。所以这取决于数据,我更喜欢更通用的解决方案......
    【解决方案2】:

    您也可以只使用.iloc[0],但请记住,如果您调用的系列中没有至少一个项目,它将引发IndexError。

    s = event_data.loc[event_data.event_id == event_id, 'max_total_gross']
    s.iloc[0]
    

    【讨论】:

      【解决方案3】:

      item() 方法仍然很有用,如果您想断言 Series 的长度正好为 1,并同时获得该单个值。我建议更换:

      result = ser.item()
      

      与:

      result = ser.values.item()
      

      应该做你想做的事。

      【讨论】:

        【解决方案4】:

        pandas 1.0 中再次不推荐使用此用例:

        Series.item() 和 Index.item() 已弃用 (GH29250)

        来自https://pandas.pydata.org/docs/whatsnew/v1.0.0.html#deprecations。另见问题GH29250中的讨论。

        因此请考虑更新或忽略或消除警告。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-12
          • 1970-01-01
          • 1970-01-01
          • 2019-04-04
          • 2018-12-12
          • 2014-09-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多