Как заменить определенные значения в столбце dataframe из словаря? - PullRequest
1 голос
/ 16 октября 2019

Итак, у меня есть таблица следующего вида:

Col1     Col2
ABS      45
CDC      23
POP      15

Теперь у меня есть словарь aa = {'A':'AD','P':'PL','C':'LC'}. Так что только для соответствующих ключевых частей я хочу изменить значения в столбце. Для других букв, которые не совпадают, ключи словаря должны оставаться неизменными.

Финальная таблица должна выглядеть следующим образом:

Col1     Col2
ADBS     45
LCDLC    23
PLOPL    15

Я пытаюсь использовать следующий код, но это не такработает.

df['Col1'].str.extract[r'([A-Z]+)'].map(aa)

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Решение

df = pd.DataFrame({'Col1': ['ABS', 'CDC', 'POP'], 
                   'Col2': [45, 23, 15], 
                  })

keys = aa.keys()
df.Col1 = [''.join([aa.get(e) if (e in keys) else e for e in list(ee)]) for ee in df.Col1.tolist()]
df

Вывод :

enter image description here

Распаковка сжатого списка Понимание

Давайте запишем понимание списка в более удобочитаемой форме. Мы создаем функцию do_something, чтобы понять, что происходит в первой части списка-понимания. Вторая часть (for ee in df.Col1.tolist()) по существу перебирает каждую строку в столбце 'Col1' кадра данных df.

def do_something(x):
    # here x is like 'ABS'
    xx = '.join([aa.get(e) if (e in keys) else e for e in list(x)])
    return xx
df.Col1 = [do_something(ee) for ee in df.Col1.tolist()]

Распаковка do_something(x)

Функция do_something(x) выполняет следующие действия. Будет проще, если вы попробуете это с x = 'ABS'. ''.join(some_list) in do_something присоединяется к созданному списку. Следующий блок кода иллюстрирует это.

x = 'ABS'
print(do_something(x))
[aa.get(e) if (e in keys) else e for e in list(x)]

Вывод :

ADBS
['AD', 'B', 'S']

Так в чем логика ядра?

Следующий кодовый блок показывает вам шагшаг за шагом, как работает логика. Очевидно, что list comprehension, введенный в начале решения, сжимает nested for loops в одну строку и, следовательно, должно быть предпочтительным по сравнению со следующим.

keys = aa.keys()
packlist = list()
for ee in df.Col1.tolist():
    # Here we iterate over each element of 
    # the dataframe's column (df.Col1)

    # make a temporary list
    templist = list()
    for e in list(ee):
        # here e is a single character of the string ee
        # example: list('ABS') = ['A', 'B', 'S']
        if e in keys:
            # if e is one of the keys in the dict aa
            # append the corresponding value to templist
            templist.append(aa.get(e))
        else:
            # if e is not a key in the dict aa
            # append e itself to templist
            templist.append(e)
    # append a copy of templist to packlist
    packlist.append(templist.copy())

# Finally assign the list: packlist to df.Col1 
# to update the column values
df.Col1 = packlist

Ссылки

Понимание списков и диктов - это очень мощные инструменты, которые любой программист на python сочтет удобными и изящными при кодировании. У них есть возможность аккуратно сжать сложный кодовый блок в одну или две строки. Я бы посоветовал вам взглянуть на следующее.

  1. Понимание списка: python.org
  2. Понимание Dict: python.org
  3. Понимание спискав Python: medium.com
0 голосов
/ 16 октября 2019

вы можете сделать это с помощью замены, как показано ниже

df = pd.DataFrame([['ABS', '45'], ['CDC', '23'], ['POP', '15']], columns=('Col1', 'Col2'))
aa = {'A':'AD','P':'PL','C':'LC'}
pat = "|".join(aa.keys())
df["Col1"].str.replace(pat, lambda x: aa.get(x[0], x[0]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...