pandas 2.1.0 中的未来警告消息

Future warning message in pandas 2.1.0

提问人:George 提问时间:9/17/2023 更新时间:9/18/2023 访问量:439

问:

我有以下代码:

df['FilterVol'] = np.NaN
df.loc[(df['Volume'] >= df['PrevVolume']), 'FilterVol'] = 1   
df['DaysLast2Week'] = df['FilterVol'].rolling(14, min_periods=1).apply(value_counts)

我收到以下未来警告消息: FutureWarning:在单个元素 Series 上调用 float 已弃用,将来会引发 TypeError。请改用 float(ser.iloc[0])

FutureWarning:pandas.value_counts 已弃用,将在将来的版本中删除。使用 pd。Series(obj).value_counts() 代替。

所有这些都是在将我的系统从 python 3.9 升级到 3.11 以及对包括 pandas 在内的各种软件包进行一系列升级之后实现的。我目前的 pandas 版本是 2.1.0。 我表中的所有列都是 dtype: float64。 我尝试了一些选择,但似乎没有任何效果。谁能告诉我如何修改此代码以摆脱这些警告?

pandas 已弃用 deprecation-warning

评论

0赞 Scott Boston 9/17/2023
也许使用 lambda。尝试 apply(lambda x: x.value_counts())。
0赞 George 9/17/2023
不幸的是,没有变化
0赞 Parfait 9/18/2023
如果你引用方法怎么办:?这实际上可能是一张有用的熊猫团队票,在引擎盖下,这种滚动计算仍然使用已弃用的形式。如果发布 Git 问题,请务必设置 reprex.apply('value_counts')

答:

1赞 Timeless 9/18/2023 #1

IIUC,您可以简单地 Rolling.sum 一次性关闭两个 sFutureWarning

FutureWarningpandas.value_counts 已弃用,将在将来的版本中删除。使用 pd。Series(obj).value_counts() 代替。
在单个元素 Series 上调用 float 已弃用,将来会引发 TypeError。请改用 float(ser.iloc[0])
FutureWarning

df["DaysLast2Week"] = df["FilterVol"].rolling(14, min_periods=1).sum()

另一个变体,不使用中间列:FilterVol

m = df["Volume"].ge(df["PrevVolume"])

df["DaysLast2Week"] = m.mask(~m).rolling(14, min_periods=1).sum()

输出:

print(df) # with your fixed approach

    Volume  PrevVolume  FilterVol  DaysLast2Week
0      117         392        NaN            NaN
1      315         241        1.0            1.0
2      152         119        1.0            2.0
3      335          80        1.0            3.0
4      283         235        1.0            4.0
..     ...         ...        ...            ...
95     183         159        1.0            5.0
96     346         231        1.0            6.0
97     262         240        1.0            6.0
98     278         296        NaN            6.0
99     274         144        1.0            7.0

[100 rows x 4 columns]

使用的输入:

np.random.seed(1)

df = pd.DataFrame({
    "Volume": np.random.randint(80, 350, 100),
    "PrevVolume": np.random.randint(65, 400, 100)}
)

评论

0赞 Parfait 9/18/2023
OP 是否尝试滚动求和?还是滚动?value_counts
0赞 Timeless 9/18/2023
除非我弄错了,否则等价于 .pd.Series([np.nan, 1, 1, np.nan]).value_counts()pd.Series([np.nan, 1, 1, np.nan]).sum()