如何使用列表中的随机抽取重新映射pandas列中的值?

2024-09-27 22:21:12 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我有一个数据框,需要将列重新映射到不同的值。对于某些映射不明确的值,每次遇到要映射的值时,都应从列表中随机选择结果值

例如,应按以下方式重新映射列中的值:

  • 一,➝ 'a'
  • 二,➝ 'b'或c',随机选择
  • 三,➝ 'd'

如果有两行带有2,则每次都应进行随机抽取,以确定该值是否应映射到bc

示例数据

以下是一些示例数据:

import pandas as pd
df = pd.DataFrame({"col1": [1, 2, 3, 4, 5, 6, 7, 8], "col2": [2, 2, 2, 3, 1, 2, 2, 1]})

我所调查的

我已经尝试使用映射字典使用^{}^{}调用(如this answer中所述):

choice_list = ["b", "c"]
map_dict = {1: "a", 2: random.choice(choice_list), 3: "d"}
df["remap"] = df.col2.map(map_dict)

我发现在值2的重新映射中,总是从所有行的choice_list中选择一个值,例如所有b

   col1  col2 remap
0     1     2     b
1     2     2     b
2     3     2     b
3     4     3     d
4     5     1     a
5     6     2     b
6     7     2     b
7     8     1     a

当我使用^{}方法时,也会发生类似的情况

我的预期结果是:

   col1  col2 remap
0     1     2     b
1     2     2     c
2     3     2     b
3     4     3     d
4     5     1     a
5     6     2     b
6     7     2     c
7     8     1     a

Tags: 数据import示例mappandasdf列表方式
1条回答
网友
1楼 · 发布于 2024-09-27 22:21:12
有什么问题吗

通过执行以下操作,可以一次性选择不需要的替换值

map_dict = {1: "a", 2: random.choice(choice_list), 3: "d"}
如何修复它

您需要在每次绘制地图时进行随机选择

为此更改map_dict格式并使用小包装:

import random
map_dict = {1: ["a"], 2: ["b", "c"], 3: ["d"]}
df["remap"] = df.col2.map(lambda x: random.choice(map_dict[x]))

可能的产出:

   col1  col2 remap
0     1     2     c
1     2     2     b
2     3     2     c
3     4     3     d
4     5     1     a
5     6     2     b
6     7     2     c
7     8     1     a

大型数据集的快速替代方案

如果您有许多行(上万行),此替代方法将更快:

map_dict = {1: ["a"], 2: ["b", "c"], 3: ["d"]}
map_s = pd.Series(map_dict, name='remap').explode()

(df.merge(map_s, left_on='col2', right_index=True)
   .groupby(level=0).sample(1)
)

相关问题 更多 >

    热门问题