在调试过程中,熊猫给出了一个错误:"TypeError: 'NoneType' object is not callable"



我有一个记录表。

data  stage  epoch
0     0  train      0
1     1  valid      1
2     2  train      0
3     3  valid      1
4     4  train      2
5     5  valid      3

我想用"train"one_answers"valid"分隔这个表,从"epoch"的最后一个0开始。我的代码如下:

import numpy as np
import pandas as pd    
class SL(object):
def select(self, df):
df_train = df[df["stage"] == "train"]
df_valid = df[df["stage"] == "valid"]
index_zero = np.where(df["epoch"].values == 0)[0][-1]
df_train = df_train.loc[index_zero:, :]
df_valid = df_valid.loc[index_zero:, :]
print(df_train,"n", df_valid)
df = pd.DataFrame({"data":range(6), "stage":["train","valid","train", "valid","train","valid"], "epoch":[0,1,0,1,2,3]})
SL().select(df)

当我直接运行它时,它工作正常,

data  stage  epoch
2     2  train      0
4     4  train      2 
data  stage  epoch
3     3  valid      1
5     5  valid      3

但是当我用Pycharm调试时,df_valid = df_valid.loc[index_zero:, :]总是给出错误TypeError: 'NoneType' object is not callable,有人知道为什么吗?

这是一个已知的错误,仅在Python 3.10上调试某些numpy支持的代码时发生。这个错误起源于Cython,最近已经修复了。几天前,Numpy 1.22.4已经发布,使用新的Cython构建,也解决了Numpy中的问题。现在您可能仍然需要重新构建Pandas和scikit -学习使用最新的Numpy。

您可以使用类似的命令来完成此操作:

CFLAGS="-DCYTHON_FAST_PYCALL=0" pip install --force-reinstall --no-binary numpy,scikit-learn,pandas scikit-learn pandas numpy scipy

IIUC,您可以首先过滤掉最后一个0之前的行,然后使用groupby:

进行分割
s = df['epoch'].eq(0).cumsum()
d = {k: g for k,g in df[s.eq(s.iloc[-1])].groupby(df['stage'])}

输出:

{'train':    data  stage  epoch
2     2  train      0
4     4  train      2,
'valid':    data  stage  epoch
3     3  valid      1
5     5  valid      3}

最新更新