Для фрейма данных pandas с одним столбцом ключей и одним столбцом значений создайте другой столбец словарей - PullRequest
1 голос
/ 24 сентября 2019

У меня есть следующий фрейм данных:

    c1  c2          freq
0   a   [u]         [4]
1   b   [x, z, v]   [8, 3, 15]

Я хочу получить другой столбец "dict" такой, что

    c1  c2          freq         dict
0   a   [u]         [4]          {'u':4}
1   b   [x, z, v]   [8, 3, 15]   {'x':8, 'z':3, 'v':15}

Я пытаюсь этот код: d["dict"] = d.apply(lambda row: dict(zip(row["c2"], row["freq"]))), но этовыдает ошибку: KeyError: ('c2', u'occurred at index c1')

Не уверен, что я делаю не так.В целом упражнение состоит в том, что у меня есть глобальный словарь, определенный следующим образом: {"u":4, "v":15, "x":8, "z":3}, и мой начальный кадр данных:

    c1  c2
0   a   u
1   b   [x, z, v]

, где [x, z, v] - это массив пустышек.Для каждой строки я хочу сохранить 2 верхних элемента (если это массив) с самыми высокими значениями из глобального словаря, поэтому для второй строки я сохраню x и v.Для этого я преобразовал каждый элемент столбца c2 в список, создал новый столбец с соответствующими частотами и теперь хочу преобразовать его в словарь, чтобы можно было отсортировать его по значениям.Затем я сохраню 2 верхние клавиши словаря этой строки.

d["c2"] = d["c2"].apply(lambda x: list(set(x)))
d["freq"] = d["c2"].apply(lambda x: [c[j] for j in x])
d["dict"] = d.apply(lambda row: dict(zip(row["c2"], row["freq"])))

Третья строка вызывает проблемы.Кроме того, если есть более эффективная процедура для всего этого, я буду рад любому совету.Спасибо!

Ответы [ 2 ]

5 голосов
/ 24 сентября 2019

Используйте понимание списка:

df['dict'] = [dict(zip(a,b)) for a, b in zip(df['c2'], df['freq'])]
print (df)
  c1         c2        freq                       dict
0  a        [u]         [4]                   {'u': 4}
1  b  [x, z, v]  [8, 3, 15]  {'x': 8, 'z': 3, 'v': 15}

Или в вашем решении добавьте axis=1 для обработки по строкам:

df["dict"] = df.apply(lambda row: dict(zip(row["c2"], row["freq"])), axis=1)
1 голос
/ 24 сентября 2019

Вы можете решить вашу основную проблему проще, используя аргументы key и reverse встроенного sorted.Вы готовите частичную функцию и отображаете ее поверх столбца вместе с предпочитаемой функцией поднабора в стиле цепочки методов:

import pandas as pd
from functools import partial

df = pd.DataFrame({'c1': ['a', 'b'], 'c2': ['u', ['x','z','v']]})

c = {"u":4, "v":15, "x":8, "z":3}

sorter = partial(sorted, key=lambda x: c[x], reverse=True)

def subset(l):
    return l[:2]

df['highest_two'] = df['c2'].map(sorter).map(subset)

print(df)

"""
Out:
      c1         c2 highest_two
    0  a          u         [u]
    1  b  [x, z, v]      [v, x]
"""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...