Python 3 - список отображения в столбце Pandas - PullRequest
0 голосов
/ 26 октября 2018

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

   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. Поэтому мне было интересно, кто-нибудь мог бы поделиться более быстрым способом сделать это?

Ответы [ 5 ]

0 голосов
/ 26 октября 2018
my_dict= {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E'}
df['team Id']=df['team Id'].map(my_dict)
0 голосов
/ 26 октября 2018

, если позиция каждого имени команды в вашем списке 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)})
0 голосов
/ 26 октября 2018

Это решение вдохновлено этим ответом здесь и может быть адаптировано для решения вашего вопроса. Вы можете использовать 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 после того, как я составил свой ответ, поэтому небольшое изменение в последнем утверждении приведет к желаемому результату (примечание @ Эдгар Р. Мондрагон опубликовал эта часть первая в своем ответе):

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
0 голосов
/ 26 октября 2018

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

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

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
0 голосов
/ 26 октября 2018

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

EDIT

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

df["team ID"] = df["team ID"].replace(dict(zip(
    df["team ID"].sort_values().unique(),
    team_names
)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...