Python 3 - список сопоставлений в столбце pandas

Я пытаюсь заменить список существующих значений в столбце pandas.

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

(идентификаторы команд могут повторяться и не уникальны)

Я хочу изменить идентификатор команды на названия команд из существующего списка, который у меня уже есть

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

Раньше я делал это так:

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

Однако проблема, с которой я столкнулся сейчас, заключается в том, что два списка, между которыми я хочу сопоставить, почти 100. Так что мне было интересно, может ли кто-нибудь поделиться более быстрым способом сделать это?

stackoverflow.com/questions/36846060/… Это то, что вы хотите сделать?
user1394 26.10.2018 06:32

Так вы просто хотите ['A', 'B', 'C', ....., 'AA', 'AB', 'AC']?

rahlf23 26.10.2018 06:41
3
2
648
5

Ответы 5

Вы можете 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'}

РЕДАКТИРОВАТЬ

Если порядок названий команд в вашем списке соответствует идентификаторам (1-> "A", 2 -> "B", etc.), то это работает:

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

Что, если бы я пытался заменить существующий список в самих столбцах? df.element_type = df.element_type.replace (dict (zip ([df.element_type.unique], [A, B, C, D])))

Theolck 26.10.2018 06:22

Какой существующий список? Измените свой вопрос, указав в качестве примера входные данные и ожидаемый результат.

Edgar Ramírez Mondragón 26.10.2018 06:24

Это решение основано на ответе здесь и может быть адаптировано для решения вашего вопроса. Вы можете использовать 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

Если вы действительно хотите заменить идентификатор на соответствующее имя:

Создайте словарь перевода:

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

если позиция каждого названия команды в вашем списке 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)})
my_dict= {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}
df['team Id']=df['team Id'].map(my_dict)

Другие вопросы по теме