我正在尝试替换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个。所以我想知道是否有人可以共享一种更快的方法?
答案 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)