【问题标题】:ValueError: DataFrame constructor not properly called error on trying to call the data from pipelineValueError:DataFrame 构造函数在尝试从管道调用数据时未正确调用错误
【发布时间】:2021-11-27 05:43:24
【问题描述】:

我试图在使用 StandardScaler 之前和之后可视化 iris 数据集 使用 seaborn 但我在尝试定义 DataFrame 时出错

我发现了很多类似的问题,但没有一个解释如何将管道数据转换为 DataFrame

        X = DATA.drop(['class'], axis = 'columns')
        y = DATA['class'].values
        
        X_train, X_test, y_train, y_test=train_test_split(X,y, test_size=0.20,random_state =42)

        gbl_pl=[]
        gbl_pl.append(('standard_scaler_gb',
        StandardScaler()))
        print(gbl_pl)           
        gblpq=Pipeline((gbl_pl))
        scaled_df=gblpq.fit(X_train,y_train)
        print(scaled_df.named_steps['standard_scaler_gb'].mean_)
      
        scaled_df =pd.DataFrame(scaled_df,
        columns=['petal_length', 'petal_width',
        'sepal_length','sepal_width'])        
        
        fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(6, 5))
        ax1.set_title('Before Scaling')
        sns.kdeplot(X['petal_length'], ax=ax1)
        sns.kdeplot(X['petal_width'], ax=ax1)
        sns.kdeplot(X['sepal_length'], ax=ax1)
        sns.kdeplot(X['sepal_width'], ax=ax1)
                
        ax2.set_title('After Standard Scaler')
        sns.kdeplot(scaled_df['petal_length'], ax=ax2)
        sns.kdeplot(scaled_df['petal_width'], ax=ax2)
        sns.kdeplot(scaled_df['sepal_length'], ax=ax2)
        sns.kdeplot(scaled_df['sepal_width'], ax=ax2)
        plt.savefig("output73.png")

错误

    columns=['petal_length', 'petal_width',
   File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.8/site-packages/pandas/core/frame.py", line 509, in __init__
     raise ValueError("DataFrame constructor not properly called!")
 ValueError: DataFrame constructor not properly called!

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • @furas 我的原始程序实际上很大,所以回溯很长,但我已经更新了所有与熊猫库相关的回溯

标签: python pandas scikit-learn seaborn


【解决方案1】:

您正在将转换器(StandardScalerPipeline)与数据混为一谈。 gblpq.fit(X_train y_train) 的返回值是一个管道对象,而不是数据。要获取缩放后的数据,可以使用管道的transform 方法(或方便组合fit_transform)。

    ...
    scaled_df = gblpq.fit_transform(X_train, y_train)
    # gblpq is now fitted and contains learned statistics like the means:
    print(gblpq.named_steps['standard_scaler_gb'].mean_)
    # while scaled_df contains the transformed data as a numpy array
    
    scaled_df = pd.DataFrame(
        scaled_df,
        columns = [petal_length', petal_width', 'sepal_length', 'sepal_width']
    )
    ...

【讨论】:

  • 你能举一个从管道获取缩放数据的例子吗?
  • 它现在工作正常,感谢您解释包含统计信息的 gbpq 和包含数据的 scaled_df 之间的区别
猜你喜欢
  • 2020-10-01
  • 2018-05-06
  • 2014-10-25
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多