2017-03-09 45 views
1

所以我有这个非常愚蠢的问题,我一直在徘徊数小时。 我正在练习kaggle的泰坦尼克号练习,使用graphlab创建。Graphlab:替换Sframe中的值和过滤

我的数据如下图所示: Data

现在我想在表来代替某些价值观。例如,我想设置(作为测试),年龄为38岁,Pclass == 1 30,Pclass == 2和26年级P级== 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) 

但现在我的数据帧已经变成了一个列表...(显然)

伊尔也曾尝试:

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

但我得到的以下错误:“RuntimeError:运行时异常。列__PassengerId-Survived-Pclass-Sex-Age-Fare”与当前列大小不同!“

我确定解决方案非常简单,但我太困惑了,无法自己找到它。

最终我想是这样 DF [ “年龄”] = something.apply(拉姆达X:38如果Pclass == 1否则如果30 Pclass == 2否则如果26 == Pclass 3)

谢谢。

+0

所以我通过这样做了一些进展:df [“Age”] = df [“Age”]。apply(lambda x:38 if x == 1 else 30 if x == 26 else 26)...然而,自写df [“年龄”] = df [“年龄”]以来,我仍然坚持不懈。apply(lambda x:38 if x [“Pclass”] == 1 else 30 if x [“Pclass”] == 26 else 26)返回错误TypeError:'float'object has no attribute'__getitem__' – Mike

回答

2

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

只需创建原Sframe新列“Pclass_”,那么你可以做:

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

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

0

好的,我花了一些时间在这个问题上,发现了一个解决方案:使用熊猫。 我习惯了熊猫,但在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 

而我所做的一切工作正常。