将列表列表映射到 pandas Series

1 投票
1 回答
1740 浏览
提问于 2025-04-18 10:42

我刚接触Python,有个简单的问题让我有点困惑。

假设我有一个叫做my_series的pandas系列,内容如下:

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

我还有一个叫做my_lookup的查找列表,内容是这样的:

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_series中的每一对值替换成my_lookup中对应的值。这样的话,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)]

补充:我想用字典和map函数来实现,像这样:

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

..但是我的键是列表,Python似乎不太喜欢这样,所以我在尝试其他方法。

1 个回答

3

你使用字典的思路是对的。

你的“键”会不会改变呢?从你最开始定义的系列来看,它们似乎不会改变,但你把它们放在了 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 的值。

撰写回答