Python 3-熊猫列中的映射列表

时间:2018-10-26 04:02:34

标签: python python-3.x pandas

我正在尝试替换pandas列中的现有值列表。

   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个。所以我想知道是否有人可以共享一种更快的方法?

5 个答案:

答案 0 :(得分:0)

您可以zip列出两个列表,然后将结果传递给字典:

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
)))

答案 1 :(得分:0)

此解决方案受此答案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列中包含非唯一值,因此,对最后一条语句稍加修改将产生所需的结果(请注意@EdgarR。蒙德拉贡(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

答案 2 :(得分:0)

如果确实只想用相应的名称替换ID:

创建翻译词典:

dict= {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}

然后替换为相应的值:

df['team_ID'] = pd.Series([dict[i] for i in list(df.team_ID) if i in list(df.team_ID)])

礼物:

     team_ID  win
0       A    8
1       A    4
2       C    5
3       D    2
4       E    1

答案 3 :(得分:0)

如果每个团队名称在team_names列表中的位置与team_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)})

答案 4 :(得分:0)

my_dict= {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}
df['team Id']=df['team Id'].map(my_dict)