Graphlab:替换 Sframe 中的值和过滤
Graphlab : replacing values in Sframe and filtering
所以我有一个非常愚蠢的问题,我已经被绊倒了几个小时。
我正在使用 graphlab create 练习 kaggle 的 Titanic ML 练习。
我的数据如下图:
现在我想替换 table 中的一些值。例如,我想将年龄设置为(作为测试)Pclass==1 的年龄为 38,Pclass==2 的年龄为 30,Pclass==3
的年龄为 26
我已经尝试了很多方法来做到这一点,以至于我迷路了。
我现在只有:
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)
returns 一个具有正确值的数组,但我无法将其应用于 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 if Pclass==1 else 30 if Pclass==2 else 26 if Pclass==3)
谢谢。
好的,我在这个问题上花了一些时间并找到了解决方案:使用 pandas。
我已经习惯了 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
我完成了,一切正常。
您可以使用如下替代代码:
只需在原来的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']]
您可以在列表中使用任何类型的 (if-else-if) 条件。
所以我有一个非常愚蠢的问题,我已经被绊倒了几个小时。 我正在使用 graphlab create 练习 kaggle 的 Titanic ML 练习。
我的数据如下图:
现在我想替换 table 中的一些值。例如,我想将年龄设置为(作为测试)Pclass==1 的年龄为 38,Pclass==2 的年龄为 30,Pclass==3
的年龄为 26我已经尝试了很多方法来做到这一点,以至于我迷路了。
我现在只有:
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)
returns 一个具有正确值的数组,但我无法将其应用于 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 if Pclass==1 else 30 if Pclass==2 else 26 if Pclass==3)
谢谢。
好的,我在这个问题上花了一些时间并找到了解决方案:使用 pandas。 我已经习惯了 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
我完成了,一切正常。
您可以使用如下替代代码:
只需在原来的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']]
您可以在列表中使用任何类型的 (if-else-if) 条件。