将列表列表映射到pandas系列

时间:2014-06-22 21:58:04

标签: python list map

Python新手。简单的问题让我头晕目眩。

假设我有一个大熊猫系列如下:

my_series = pd.Series([(1,2), (2,3), (1,3)])

我还有一个“查找”列表列表,如下所示:

my_lookup = [([0,1], 0), ([1,1], 1), ([1,2], 2), ([2,2], 3), ([0,3], 4), ([1,3], 5), ([2,3], 6)]

1)我想知道如何用my_lookup中相应的值替换my_series中的每一对。在这种情况下,my_series应该成为pd.Series([2,6,5])。

2)我想知道如何创建一个具有相应值的新系列,而不是像上一个问题那样替换。

3)如果不是每个“密钥”都在my_lookup中,答案是否会改变?例如,如果my_lookup改为:

my_lookup = [([0,1], 0), ([1,1], 1), ([2,2], 3), ([0,3], 4), ([1,3], 5), ([2,3], 6)]

编辑:我想使用字典和地图功能如下:

df["Gender"] = df["Sex"].map({"female":0, "male":1}).astype(int)

..但我的密钥是列表,Python似乎不喜欢这样,所以我正在尝试不同的路径。

1 个答案:

答案 0 :(得分:2)

使用字典肯定是在正确的轨道上。

你的'钥匙'可能会改变吗?从您系列的初始声明开始,看起来他们不会,但您确实将它们作为my_lookup中的列表。

如果它们的键不会改变,您可以将它们转换为元组并将它们用作字典中的键。例如(在普通的python中,因为我没有在这台计算机上安装pandas进行测试):

d = {tuple(k): v for k,v in my_lookup}

然后,要替换系列中的每个键,您可以执行以下操作:

fReplace = lambda k: d[k]
new_series = map(fReplace, my_series) # or my_series.map if you're in pandas

# alternatively (and there's probably a nicer way, I don't have pandas to play with)
new_series = pd.Series(map(fReplace, my_series))

如果不是每个键都在查找中,则需要确定是否存在合理的默认值。如果有,您可以在字典上使用.get

fReplace = lambda k: d.get(k, sensible_default_value)

如果没有,您可以使用None作为默认值,然后过滤到结果系列以删除None的值。