在python中向数据集添加列

在python中向数据集添加列,python,pandas,dataframe,Python,Pandas,Dataframe,我试图用Python将预测数据添加回我的原始数据集。我想我应该使用Pandas和ASSIGN以及pd.DataFrame,但在阅读了所有文档之后,我不知道如何编写它(很抱歉,我对所有这些都是新手,最近才开始学习编码)。我已经在下面编写了代码,只需要帮助我将预测添加回数据集。谢谢你的帮助 # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd # Import

我试图用Python将预测数据添加回我的原始数据集。我想我应该使用Pandas和ASSIGN以及pd.DataFrame,但在阅读了所有文档之后,我不知道如何编写它(很抱歉,我对所有这些都是新手,最近才开始学习编码)。我已经在下面编写了代码,只需要帮助我将预测添加回数据集。谢谢你的帮助

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25,     
random_state = 0)

# Feature Scaling X_train and X_test
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

#Feature scaling the all independent variables used to build the model
whole_dataset = sc.transform(X)

# Fitting classifier to the Training set
# Create your Naive Bayes here
from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

# Predicting the Test set results
y_pred = classifier.predict_proba(X_test)

# Predicting the results for the whole dataset
y_pred2 = classifier.predict_proba(whole_dataset) 

# Add y_pred2 predictions back to the dataset
???

只需执行
dataset['prediction']=y_pred
即可添加新列

Pandas支持添加新列的简单语法,在这里它将添加一个新列,并可能查看从sklearn返回的numpy数组,因此它应该很好而且快速

编辑

查看您的代码和数据,您误解了
train\u test\u split
的作用,这是将数据拆分为原始数据集的3/4 1/4个部分,原始数据集有400行,X train数据包含300行,测试数据有100行。然后,您将尝试重新分配给原始数据集(400行)。首先,行数不匹配,其次,从
predict\u proba
返回的是预测类的矩阵(以百分比表示)。因此,培训后,您要做的是在原始数据集上进行预测,并通过子选择每列将其分配回2列:

y_pred = classifier.predict_proba(X)
现在将此分配回:

dataset['predict_class_1'],dataset['predict_class_2'] = y_pred[:,0],y_pred[:,1]

只需执行
dataset['prediction']=y_pred
即可添加新列

Pandas支持添加新列的简单语法,在这里它将添加一个新列,并可能查看从sklearn返回的numpy数组,因此它应该很好而且快速

编辑

查看您的代码和数据,您误解了
train\u test\u split
的作用,这是将数据拆分为原始数据集的3/4 1/4个部分,原始数据集有400行,X train数据包含300行,测试数据有100行。然后,您将尝试重新分配给原始数据集(400行)。首先,行数不匹配,其次,从
predict\u proba
返回的是预测类的矩阵(以百分比表示)。因此,培训后,您要做的是在原始数据集上进行预测,并通过子选择每列将其分配回2列:

y_pred = classifier.predict_proba(X)
现在将此分配回:

dataset['predict_class_1'],dataset['predict_class_2'] = y_pred[:,0],y_pred[:,1]

有几种解决方案。他提到过一个。 据我所知,熊猫还有另外两种方法

  • 由于您没有提供正在使用的数据,下面是一个非常简单的示例

    import pandas as pd
    import numpy as np
    np.random.seed(1)
    df = pd.DataFrame(np.random.randn(10), columns=['raw'])
    df = df.assign(cube_raw=df['raw']**2)
    df.insert(1,'square_raw',df['raw']**3)
    
    df
              raw square_raw     cube_raw
    0    1.624345   2.638498     4.285832
    1   -0.611756   0.374246    -0.228947
    2   -0.528172   0.278965    -0.147342
    3   -1.072969   1.151262    -1.235268
    4    0.865408   0.748930     0.648130
    5   -2.301539   5.297080   -12.191435
    6    1.744812   3.044368     5.311849
    7   -0.761207   0.579436    -0.441071
    8    0.319039   0.101786     0.032474
    9   -0.249370   0.062186    -0.015507
    
    请记住,
    df.assign()
    在本地不起作用,因此您应该重新分配到以前的变量


    在我看来,我最喜欢
    df.insert()
    ,因为它允许您指定要插入的位置。(使用参数
    loc

    有几种解决方案。他提到过一个。 据我所知,熊猫还有另外两种方法

  • 由于您没有提供正在使用的数据,下面是一个非常简单的示例

    import pandas as pd
    import numpy as np
    np.random.seed(1)
    df = pd.DataFrame(np.random.randn(10), columns=['raw'])
    df = df.assign(cube_raw=df['raw']**2)
    df.insert(1,'square_raw',df['raw']**3)
    
    df
              raw square_raw     cube_raw
    0    1.624345   2.638498     4.285832
    1   -0.611756   0.374246    -0.228947
    2   -0.528172   0.278965    -0.147342
    3   -1.072969   1.151262    -1.235268
    4    0.865408   0.748930     0.648130
    5   -2.301539   5.297080   -12.191435
    6    1.744812   3.044368     5.311849
    7   -0.761207   0.579436    -0.441071
    8    0.319039   0.101786     0.032474
    9   -0.249370   0.062186    -0.015507
    
    请记住,
    df.assign()
    在本地不起作用,因此您应该重新分配到以前的变量



    在我看来,我最喜欢
    df.insert()
    ,因为它允许您指定要插入的位置。(使用参数
    loc

    我尝试了它,但后来得到了这个错误值error:传递的项目数错误2,位置意味着1。知道为什么会这样吗?谢谢您需要在问题中添加原始数据和代码,以便我们重现此问题。我尝试过,但后来得到了错误值错误:传递的项目数错误2,位置意味着1。知道为什么会这样吗?谢谢你需要在你的问题中添加原始数据和代码,以便我们重现这一点。我尝试生成df=dataset,然后生成df.assign(y_pred),但后来得到了以下类型错误:assign()接受1个位置参数,但给出了2个。你知道我为什么要解决这个问题吗?谢谢@zipline86
    df.assign()
    的格式应该类似于
    df.assign(\u varname\uuu=content)
    。您可能需要查看答案中的链接以了解更多详细信息。我尝试生成df=dataset,然后生成df.assign(y_pred),但随后得到了以下类型错误:assign()接受1个位置参数,但给出了2个。你知道我为什么要解决这个问题吗?谢谢@zipline86
    df.assign()
    的格式应该类似于
    df.assign(\u varname\uuu=content)
    。你可能想查看答案中的链接以了解更多细节。我想现在看看你试图做的事情,你误解了正在发生的事情。您已经将数据集拆分为一系列测试数据。然后,在训练数据集上进行训练,然后在测试数据上进行拟合。然后,您尝试将所有行重新分配回原始数据集。例如,数据集中有400行,但y_pred中只有100行,因此无法将不同长度的行重新分配。您要做的是
    y_pred=classifier.predict_proba(X)
    然后将其分配回:
    dataset['predict_class_1',dataset['predict_class_2']=y_pred[:,0],y_pred[:,1]
    非常感谢我会尝试一下的!)我对代码做了一点修改,现在可以预测400行。我无法在这里上传数据文件,但可以在第18节naive bayes zip文件中下载。csv文件称为Social_Network_Ads.csv。我希望我能让它工作:)@EdChum它工作了!谢谢酷,我会更新我的答案,包括我的上述评论,你能接受我的答案,这样这个问题就不会一直没有答案了!我如何接受你的答案来关闭线程?另外,你能不能更新你对X数据集的回答,使其在应用预测函数之前进行功能缩放(以防其他人正在做与我相同的事情)。我想现在看看你正在尝试做什么,你误解了正在发生的事情。您已将数据集拆分为一列,然后