将Pandas数据框中的字典值映射为列表

3

So I have a dataframe with a column as such:

column
--------
['getNode', 'getCodec', 'PackStore', 'DownRoute']
['MessageDigest', 'getInstance', 'SecureRandom']
...

我还有一个字典,长这样:

{
getNode: 1,
getCodec: 2, 
PackStore: 3, 
DownRoute: 4,
MessageDigest: 5, 
getInstance: 6, 
SecureRandom: 7,
...
}

我的目标是用字典中出现的值替换列中列表中的每个项目。例如:

column
--------
[1,2,3,4]
[5,6,7]
...

我尝试过进行以下调用:

df.column.map(dict)

但是我遇到了一个错误:unhashable type: 'list'

如果有额外的帮助,那太好了!谢谢!

3个回答

4

试试使用apply

df.column.apply(lambda x: pd.Series(x).map(dct).tolist())

或者只需:
df.column.apply(lambda x: list(map(dct.get, x)))

3

还有另一种方法:

df.explode('column').squeeze().map(dd).groupby(level=0).agg(list)

输出结果:

0    [1, 2, 3, 4]
1       [5, 6, 7]
Name: column, dtype: object

选项2:

pd.Series([list(map(dd.get, l)) for l in df['column']])

输出:

0    [1, 2, 3, 4]
1       [5, 6, 7]
dtype: object

时间:

应用lambda函数-映射-转为列表:

%timeit df.column.apply(lambda x: pd.Series(x).map(dd).tolist())

每次循环耗时约为1.15毫秒±39.7微秒(平均值±7次运行的标准差,每次循环1000次)

explode-squeeze-map-groupby:

%timeit df.explode('column').squeeze().map(dd).groupby(level=0).agg(list)

每次循环需要2.56毫秒,标准差为78.7微秒,平均值是7次运行的结果,每次运行循环100次。

使用列表推导和映射创建pd.Series对象:

%timeit pd.Series([list(map(dd.get, l)) for l in df['column']])

每次循环平均耗时88.7微秒,标准差为4.58微秒(7次运行,每次循环10000次)

列爆炸映射

%timeit df.column.explode().map(dd).groupby(level=0).agg(list)

每次循环平均1.21毫秒±28微秒(7次运行的平均值和标准差,每个循环1000次)

column-apply-lambda-list-map

%timeit df.column.apply(lambda x: list(map(dd.get, x)))

152微秒±4.12微秒每循环(平均值±7次运行的标准差,10000次循环每次)。

1
您是否也想测试爆炸解决方案? - BENY
1
请问您能否测试一下我的新代码? - U13-Forward
@BENY 完成了.... 查看结果 - Scott Boston
@U12-Forward 完成... 查看结果... - Scott Boston

1
让我们来使用 explode
df.column.explode().map(dd).groupby(level=0).agg(list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接