3

所以我有一个带有这样列的数据框:

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

我也有一个看起来像这样的字典:

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

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

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

我试过打电话:

df.column.map(dict)

但我得到一个错误:unhashable type: 'list'

任何额外的帮助都会很棒!谢谢!

4

3 回答 3

4

尝试apply

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

要不就:

df.column.apply(lambda x: list(map(dct.get, x)))
于 2021-10-13T00:44:38.130 回答
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-map-tolist:

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

每个循环 1.15 毫秒 ± 39.7 微秒(平均值 ± 标准偏差。7 次运行,每次 1000 次循环)

爆炸-挤压-地图-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 µs ± 4.58 µs(平均值 ± 标准偏差。7 次运行,每次 10000 次循环)

列爆炸图

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

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

列应用 lambda 列表映射

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

每个循环 152 µs ± 4.12 µs(平均值 ± 标准偏差。7 次运行,每次 10000 次循环)

于 2021-10-13T00:53:51.687 回答
1

让我们做explode

df.column.explode().map(dd).groupby(level=0).agg(list)
于 2021-10-13T01:46:22.140 回答