python - 如何映射到 Pandas 列表列中的值

标签 python pandas dictionary lambda data-science

我有以下场景。

import pandas as pd

d = {'col1': [1, 2, 3], 'col2': [['apple'], [], ['romaine', 'potatoes']}
df = pd.DataFrame(data=d)

所以数据框是:

   col1   col2
0   1     [apple]
1   2     []
2   3     [romaine, potatoes]

我还有一本字典:

my_dict = {"apple" : "fruit", "potatoes" : "vegetable", "romaine" : "lettuce"}

我想创建另一列“col3”,其中包含来自上面 my_dict 的值列表:

   col1   col2                 col3
0   1     [apple]              [fruit]
1   2     []                   []
2   3     [romaine, potatoes]  [lettuce, vegetable]

我想用apply、map、lambda写一行代码来实现:

df["col3"] = df.col2.apply(map(lambda x: pass if not x else condition_dict[x]))

我真的很困惑,想知道是否可以不编写单独的函数然后作为参数传递给应用。

最佳答案

  • 对于具有 1M 行的示例数据帧,带有 list-comprehension.apply 比带有 .explode() 的速度快约 2.5 倍.groupby(),比使用 .map() 快一点(1.15x)。
  • 如果列中有NaN,则必须用.dropna删除行,也可以用空的list填充>。
    • .fillna([]) 不起作用
    • 使用 df.col2 = df.col2.fillna({i: [] for i in df.index})
df['col3'] = df.col2.apply(lambda x: [my_dict.get(v) for v in x])

# display(df)
 col1                col2                 col3
    1             [apple]              [fruit]
    2                  []                   []
    3 [romaine, potatoes] [lettuce, vegetable]

%timeit 测试

# test data with 1M rows
d = {'col1': [1, 2, 3], 'col2': [['apple'], [], ['romaine', 'potatoes']]}
df = pd.DataFrame(d)
df = pd.concat([df]*333333)

%%timeit
df.col2.apply(lambda x: [my_dict.get(v) for v in x])
[out]:
453 ms ± 30.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

def scott(d, my_dict):
    e = d.explode('col2')
    e['col3'] = e['col2'].map(my_dict)
    return e.groupby('col1', as_index=False)[['col3']].agg(list).merge(d)

%%timeit
scott(df, my_dict)
[out]:
1.17 s ± 23.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
df.col2.map(lambda x: list(map(my_dict.get, x)))
[out]:
519 ms ± 16.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
df['col2'].explode().map(my_dict).groupby(level=0).agg(list)
[out]:
909 ms ± 8.61 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 如何映射到 Pandas 列表列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65962061/

相关文章:

python - 为什么没有应用 pandas join-on-join 后缀

python - pycharm ipython 包未加载?

python - 从数据帧的两列中提取值以创建键和值的字典

Python 将元组列表转换为嵌套字典列表

python - 使用 join 在 python 中创建字典

python - 在字典中找到一个值?

python - Flask中使用eventlet管理socketio

python - 我可以让 Anaconda 导航器查看 pypi 上的包吗?

python - 返回给定两点的直线方程的方法

python - 适用于 Appengine 的 Cython