pandas 当从数组中设置整列时,如何去掉适当的FutureWarning?

jaxagkaj  于 2022-12-10  发布在  其他
关注(0)|答案(4)|浏览(133)

在pandas v.1.5.0中,增加了一个新的警告,当一个列被从不同的dtype数组中设置时,FutureWarning会显示出来。当使用iloc时,FutureWarning会通知一个计划中的语义变化:在未来的版本中,更改将就地完成。更改日志指示如何获得旧的行为,但没有提示如何处理这种情况,而就地操作实际上是正确的选择。
更改日志中的示例:

df = pd.DataFrame({'price': [11.1, 12.2]}, index=['book1', 'book2'])
original_prices = df['price']
new_prices = np.array([98, 99])
df.iloc[:, 0] = new_prices
df.iloc[:, 0]

这是Pandas1.5.0中打印的警告:
未来警告:在未来的版本中,df.iloc[:, i] = newvals将尝试在原处设置值,而不是始终设置新数组。要保留旧行为,请使用df[df.columns[i]] = newvals,如果列不唯一,则使用df.isetitem(i, newvals)
如果我不关心是否在适当的位置,但想摆脱警告,如何摆脱警告?我应该显式地改变dtype吗?我真的需要每次使用这个特性时都捕捉警告吗?没有更好的方法吗?

pqwbnv8z

pqwbnv8z1#

我还没有找到比使用warnings模块抑制警告更好的方法:

import numpy as np
import pandas as pd
import warnings

df = pd.DataFrame({"price": [11.1, 12.2]}, index=["book1", "book2"])
original_prices = df["price"]
new_prices = np.array([98, 99])
with warnings.catch_warnings():
    # Setting values in-place is fine, ignore the warning in Pandas >= 1.5.0
    # This can be removed, if Pandas 1.5.0 does not need to be supported any longer.
    # See also: https://stackoverflow.com/q/74057367/859591
    warnings.filterwarnings(
        "ignore",
        category=FutureWarning,
        message=(
            ".*will attempt to set the values inplace instead of always setting a new array. "
            "To retain the old behavior, use either.*"
        ),
    )

    df.iloc[:, 0] = new_prices

df.iloc[:, 0]
3vpjnl9f

3vpjnl9f2#

因为我还不能发表评论,所以在这里发帖。
现在我想我也会抑制警告,因为我不想要旧的行为,从来没有想过要这样使用它。

dtcbnfnu

dtcbnfnu3#

如changelog所述,当使用不同的dtype* 设置数组 * 中的整列时,会打印警告,因此调整dtype是一种使其静默的方法:

df = pd.DataFrame({'price': [11.1, 12.2]}, index=['book1', 'book2'])
original_prices = df['price']
new_prices = np.array([98, 99]).astype(float)
df.iloc[:, 0] = new_prices
df.iloc[:, 0]

注意额外的.astype(float)。不是理想的解决方案,但是一个解决方案。

sgtfey8w

sgtfey8w4#

我只是暂时过滤所有未来的警告:

import warnings
warnings.simplefilter("ignore", category=FutureWarning)

相关问题