列中的python3映射列表

2024-04-20 08:56:52 发布

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

我正在尝试替换列中现有值的列表。你知道吗

   team ID ... win
0     1 ...   8
1     1 ...   4
2     3 ...   5
3     4 ...   2
4     5 ...   1

(团队ID可以重复并且不是唯一的)

我希望将团队ID从现有的列表中更改为团队名称

team_names = ['A', 'B', 'C', 'D']

我以前是这样做的:

df.name = df.name.replace({
    1: 'A',
    2: 'B',
    3: 'C',
    4: 'D'
})

然而,我现在面临的问题是,我想要映射的两个列表几乎是100个。所以我想知道是否有人能分享一个更快的方法?你知道吗


Tags: 方法name名称iddf列表names团队
3条回答

如果团队名称列表中每个团队名称的位置与团队id相对应,则可以执行以下操作:

{i[0]:i[1] for i in enumerate(team_names)}

{0: 'A', 1: 'B', 2: 'C', 3: 'D'}

用上面的dict理解替换手动词典:

df.name = df.name.replace({i[0]:i[1] for i in enumerate(team_names)})

此解决方案受此答案here的启发,可以根据您的问题进行调整。您可以使用itertools.product()string.ascii_uppercase来创建一个类似['A', 'B', 'C', ....., 'AA', 'AB', 'AC']的字母列表,其长度与您的数据帧相同:

import pandas as pd
import string
import itertools

newlist = []

def iter_all_strings():
    for size in itertools.count(1):
        for s in itertools.product(string.ascii_uppercase, repeat=size):
            yield "".join(s)

for s in itertools.islice(iter_all_strings(), len(df)):
    newlist.append(s)

df['team ID'] = newlist

收益率:

  team ID  win
0       A    8
1       B    4
2       C    5
3       D    2
4       E    1

我看到,在我编写答案之后,您修改了输入数据帧,在team ID列中包含了非唯一值,因此对最后一个语句稍作修改将产生所需的结果(注意@Edgar R.Mondragón在他的答案中首先发布了这部分内容):

df['team ID'] = df["team ID"].replace(dict(zip(
    df["team ID"].sort_values().unique(),
    newlist
)))

收益率:

  team ID  win
0       A    8
1       A    4
2       B    5
3       C    2
4       D    1

您可以zip这两个列表,然后将结果传递给dict:

df.element_type = df.element_type.replace(dict(zip(list1, list2)))

zip的工作原理如下:

>>> dict(zip([1, 2, 3], ["a", "b", "c"]))
{1: 'a', 2: 'b', 3: 'c'}

编辑

如果列表中团队名称的顺序与id(1-> "A", 2 -> "B", etc.)相对应,则此操作有效:

df["team ID"] = df["team ID"].replace(dict(zip(
    df["team ID"].sort_values().unique(),
    team_names
)))

相关问题 更多 >