将列表列表映射到 pandas Series
我刚接触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
的值。