Python 如何替换串联列表中的元素
我有一个如下所示的数据帧 df1Python 如何替换串联列表中的元素,python,pandas,Python,Pandas,我有一个如下所示的数据帧 df1 col1 0 10 1 [5, 8, 11] 2 15 3 12 4 13 5 33 6 [12, 19] 生成此df1的代码: df1 = pd.DataFrame({"col1":[10,[5,8,11],15,12,13,33,[12,19]]}) df2 col1 col2 0 12 1 1 10 2
col1
0 10
1 [5, 8, 11]
2 15
3 12
4 13
5 33
6 [12, 19]
生成此df1
的代码:
df1 = pd.DataFrame({"col1":[10,[5,8,11],15,12,13,33,[12,19]]})
df2
col1 col2
0 12 1
1 10 2
2 5 3
3 11 10
4 7 5
5 13 4
6 8 7
生成此df2的代码:
df2 = pd.DataFrame({"col1":[12,10,5,11,7,13,8],"col2":[1,2,3,10,5,4,7]})
我想用df2
值替换df1
中的元素
如果序列值包含非列表元素,
我可以用map
df1['res'] = df1['col1'].map(df2.set_index('col1')["col2"].to_dict())
但是现在这个系列包含列表和标量的混合。
如何有效地替换列表中的元素和串联的标量值
预期产出
col1 res
0 10 2
1 [5, 8, 11] [3,7,10]
2 15 15
3 12 1
4 13 4
5 33 33
您的系列属于数据类型
object
,因为它包含int
和list
对象。这对熊猫来说效率低下,意味着矢量化解决方案将不可能实现
您可以创建映射字典并使用pd.Series.apply
。要解释列表
对象,可以捕获类型错误
。列表会遇到此特定错误,因为它们不可散列,因此不能用作字典键
d = df2.set_index('col1')['col2'].to_dict()
def mapvals(x):
try:
return d.get(x, x)
except TypeError:
return [d.get(i, i) for i in x]
df1['res'] = df1['col1'].apply(mapvals)
print(df1)
col1 res
0 10 2
1 [5, 8, 11] [3, 7, 10]
2 15 15
3 12 1
4 13 4
5 33 33
6 [12, 19] [1, 19]
谢谢你的回复。对于这种问题,矢量化解决方案是不可能的。我正在寻找这个问题的矢量化解决方案。因为我的数据集很大,我无法使用apply:(.寻求这方面的矢量化方法problem@MohamedThasinah,根据数据的结构方式,不,这是不可能的。下面的解决方案有帮助吗?如果有,请随时接受或要求澄清。@jpp-I正在等待矢量化解决方案,因为您评论说这是不可能的,我接受答案:)如果你以后发现了,请告诉我。如果你希望考虑一下我的问题,我已经投票赞成你的问题:不幸的是,只要序列是
dtype=object
,矢量化解决方案就不可能实现。如果你想在你的系列中有一个列表
,情况总是如此。