Graphlab:替换Sframe中的值和过滤

时间:2017-03-09 19:53:04

标签: python dataframe apply kaggle graphlab

所以我有这个非常愚蠢的问题,我已经磕了几个小时。 我正在练习kaggle的泰坦尼克号ML练习,使用graphlab创建。

我的数据如下所示: Data

现在我想替换表中的一些值。例如,我想将(作为测试)年龄设置为38,对于Pclass == 1 30为Pclass == 2和26为Pclass == 3

我已经尝试了很多这样做的方法,我迷失了。

我现在拥有的只是:

df = gl.SFrame(data)
df[(df["Pclass"]==1)] #will print the rows of the table where Pclass=1
df["Age"][df["Pclass"]==1] #will display an array containg only the column "Age" for Pclass=1

现在我正在尝试正确使用SFrame.apply,但我很困惑。

我试过了

df["Age"][df["Pclass"]==1].apply(lambda x: 38)

返回一个具有正确值的数组,但我无法将其应用于SFrame。 例如,我尝试过:

df = df["Age"][df["Pclass"]==1].apply(lambda x: 38)

但是现在我的DataFrame变成了一个列表......(显然)

我也尝试过:

df["Age"] = df["Age"][df["Pclass"]==1].apply(lambda x: 38)

但是我收到以下错误:“RuntimeError:Runtime Exception。Column”__PassengerId-Survived-Pclass-Sex-Age-Fare“的大小与当前列不同!”

我确信解决方案非常简单,但我太困惑了,不能自己找到它。

最终我想要像 df [“Age”] = something.apply(lambda x:38,如果Pclass == 1,则其他30,如果Pclass == 2,则其他26,如果Pclass == 3)

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用以下替代代码:

只需创建一个新列' Pclass _'在原始的Sframe中,你可以这样做:

df['Pclass_'] = [1 if item == 38 else 2 if item == 30 else 3 if item == 26 else 4 for item in df['Age']]

您可以在列表中使用任何类型的(if-else-if)条件。

答案 1 :(得分:0)

好的,我花了一些时间来解决这个问题并找到了解决方案:使用pandas。 我已经习惯了大熊猫,但在Graphlab上我不会那么多,所以我决定不再浪费时间在这个简单的问题上。

这就是我所做的:

import pandas as pd
df2 = pd.read_csv("./train.csv")
df2.loc[(df2.Age.isnull()) & (df2["Pclass"] == 1), "Age"] = 35
df2.loc[(df2.Age.isnull()) & (df2["Pclass"] == 2), "Age"] = 30
df2.loc[(df2.Age.isnull()) & (df2["Pclass"] == 3), "Age"] = 25

我已经完成了,一切正常。