Pandas 2.1.0 FutureWarning:Series.__getitem__ 将键视为位置已弃用

问题描述 投票:0回答:1

我在使用 Pandas v2.1.0+ 时遇到了一个我无法解决的问题。

我的 pandas 数据框中有一个列列表,我需要使用自定义函数进行转换。新值取决于数据中的多个列,因此我使用 apply 就地转换列:

my_columns_to_convert = ['col1','col2','col3']

for k in my_columns_to_convert:
  df[k] = df[[k,colx]].apply(lambda x: convert_my_data(value_1_in=x[0],value_2_in=x[1]),axis=1)

这在以前版本的 pandas 中运行得很好。但现在我明白了:

FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

但我没有使用 loc 或 iloc,到目前为止我所审查的所有内容似乎都表明这就是问题所在。我该如何编写这段代码,以便将来以“正确”的方式进行操作?

在 Pandas 中使用之前的方法确实有效。

python pandas warnings
1个回答
0
投票

这个

FutureWarning
可以通过这个简单的例子在
2.1.0
中触发:

ser = pd.Series({"A": "a", "B": "b", "C": "c"})

print(A    a)

B    b
C    c
dtype: object

print(ser[1]) # gives 'b' but with a FutureWarning

目标是在 [ ]-索引时,无论是 DataFrame 还是 Series,都具有一致的行为。


因此,根据您的代码,您的

df
参见下面我的想象)很可能没有默认索引(即一系列 整数或至少一个整数列表)。因此,当在这里对每个系列
x[0]
x[1]
进行切片时,当索引是字符串
["A", "B", "C"]
时,pandas 会警告您使用
x.iloc[0]
x.iloc[1]
来代替。

my_columns_to_convert = ['col1', 'col2', 'col3']

df = pd.DataFrame(
    np.arange(12).reshape(-1, 4),
    index=list("ABC"), columns= my_columns_to_convert + ["colx"]
)

#    col1  col2  col3  colx
# A     0     3     6     3
# B    28    35    42     7
# C    88    99   110    11

def convert_my_data(value_1_in, value_2_in):
    return value_1_in * value_2_in # a simple calculation

for k in my_columns_to_convert:
    df[k] = (
        df[[k, "colx"]].apply(
            lambda x: convert_my_data(value_1_in=x[0], value_2_in=x[1]), axis=1)
    )

# the FutureWarning is displayed three times (= the length of the Series) :

FutureWarning

Series.__getitem__
将键视为位置已被弃用。在未来的版本中,整数键将始终被视为标签(与 DataFrame 行为一致)。要按位置访问值,请使用
ser.iloc[pos]
lambda x: convert_my_data(value_1_in=x[0], value_2_in=x[1]), axis=1)

顺便说一句,您的代码似乎效率不高,并且可能很容易矢量化。

© www.soinside.com 2019 - 2024. All rights reserved.