pandas Pylint报告 Dataframe 不可订阅或不支持项分配,但按预期工作

xxb16uws  于 2023-01-24  发布在  其他
关注(0)|答案(1)|浏览(145)

有一个名为topmentions的 Dataframe ,下面是一些与之相关的数据:

<class 'pandas.core.frame.DataFrame'>
    Int64Index: 30 entries, 22 to 29
    Data columns (total 2 columns):
     #   Column     Non-Null Count  Dtype 
    ---  ------     --------------  ----- 
     0   reference  30 non-null     object
     1   freq       30 non-null     int64 
    dtypes: int64(1), object(1)
    memory usage: 720.0+ bytes
    None
                        reference  freq
    22         Giorgia Meloni|PER     4
    16      Matteo Piantedosi|PER     3
    10           Donald Trump|PER     3
    28  Gianfranco Baruchello|PER     3
    3        Tomaso Montanari|PER     3

尽管变量topmentions是一个有效的 Dataframe ,尽管下面的代码按预期工作,但变量topmentions被Pylint标记为Value 'topmentions' is unsubscriptable
下面是被标记的代码:

json_string = topmentions[
    topmentions["freq"].cumsum() < topmentions["freq"].sum() / 2
].to_json(orient="records")

代码片段中的三个变量名都被标记为错误。
PS:我知道我可以通过添加# pylint: disable=unsubscriptable-object来抑制这些错误,但是我不想采用这种技巧

ujv3wf0j

ujv3wf0j1#

您的代码没有问题,这似乎是Pylint正在进行的issue,它错误地认为您的 Dataframe "不支持项分配(即不定义setitem方法)"
您可以使用Pandas loc属性,而不是禁用警告,无论如何,这可能是更可取的(请参见此处的 * 注意 * 和此post)。
因此,在下面这个(希望是)可重复的例子中(截至本答案发布之日,使用的是Python 3.10.9、Pandas 1.5.2、Pylint 2.15.9):

import pandas as pd

df = pd.DataFrame({"col0": [1, 2], "col1": ["a", "b"]})
df = df.set_index("col0")
print(df[df["col1"] == "a"])
# Output
     col1
col0     
1       a

在脚本上运行Pylint会打印出:

script.py:4:6: E1136: Value 'df' is unsubscriptable (unsubscriptable-object)
script.py:4:9: E1136: Value 'df' is unsubscriptable (unsubscriptable-object)
------------------------------------------------------------------
Your code has been rated at 0.00/10 (previous run: 0.00/10, +0.00)

现在,如果将df[df["col1"] == "a"]替换为df.loc[df.loc[:, "col1"] == "a", :]并再次运行Pylint,一切都很好:

--------------------------------------------------------------------
Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00)

同样:

df["col2"] = ["c", "d"]

加薪:

script.py:4:9: E1137: 'df' does not support item assignment (unsupported-assignment-operation)

但是df.loc[:, "col2"] = ["c", "d"]没有。

相关问题