Pandas: `item`已被弃用。

19

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

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已被弃用,将在未来版本中删除 if sys.path[0] == '':

我尝试用下面的方法修复它,但结果不同:

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

我预期只有一个整数。

4个回答

13

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

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

7

item() 方法仍然有用,如果您想要断言 Series 长度恰好为 1,并且同时获取该单个值。我建议使用以下方式替换:

result = ser.item()

使用:

result = ser.values.item()

这应该可以满足你的需求。


2

2
如果需要找到第一个匹配的值,请使用iternext,优点是如果没有匹配的值,则返回默认值:

最初的回答:使用iternext来寻找第一个匹配的值,如果没有匹配的值,则返回默认值。
s = event_data.loc[event_data.event_id == event_id, 'max_total_gross']

out = next(iter(s), 'no match')
print (out)

1
如果我需要进一步计算(而不仅仅是打印)数据,next / iter也是处理该数据的正确方式吗?在代码的后面,我执行 event_orders["y"] = event_orders["total_gross_cumsum"] / (max_total_gross * 100)。 我期望的是类似 s [0] 的方法(但不起作用)来访问该值。next / iter 从未出现在我的脑海中。 - Joey Coder
我进行了更多的实验,发现这个也可以工作:max_total_gross = event_data.loc[ event_data["event_id"] == event_id, "max_total_gross" ].values[0] 你认为哪种更好用? - Joey Coder
1
@JoeyCoder - 你的解决方案很好,如果始终至少匹配一个值。如果没有,则失败。因此,它取决于数据,我更喜欢更通用的解决方案... - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接