Преобразование списка кортежей в столбце данных Python Pandas в словарь списков с помощью метода apply - PullRequest
0 голосов
/ 16 мая 2018

У меня есть входной фрейм данных, как показано ниже:

df_in = pd.DataFrame({'Name':['Isha', 'Amy', 'Ann'], 'Classes':[\
                   [('Mon','Math'),('Mon','Science'),('Tue','English')],\
                   [('Mon','Math'),('Wed','Science'),('Tue','English')],\
                   [('Mon','Math'),('Wed','Science'),('Wed','English')]\
                   ]})

Мне нужен выходной фрейм данных, как показано ниже:

df_out = pd.DataFrame({'Name':['Isha', 'Amy', 'Ann'], 'Classes':[\
                   {'Mon':['Math','Science'],'Tue':['English']},\
                   {'Mon':['Math'],'Wed':['Science'],'Tue':['English']},\
                   {'Mon':['Math'],'Wed':['Science','English']}\
                   ]})

Можем ли мы написать любую функцию 'fun', котораяпри использовании с apply как df_in['Classes'].apply(fun) будет обновлять столбец Classes до формата в df_out?Я пытался использовать defaultdict и т.д ..., но не смог написать.Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

С itertools

import itertools as it

df_in['New']=[{k: list(x[1] for x in v) for k, v in it.groupby(sorted(y), key=lambda x: x[0])}for y in df_in.Classes]
df_in
Out[607]: 
                                         Classes  Name                                                New
0  [(Mon, Math), (Mon, Science), (Tue, English)]  Isha   {'Mon': ['Math', 'Science'], 'Tue': ['English']}
1  [(Mon, Math), (Wed, Science), (Tue, English)]   Amy  {'Mon': ['Math'], 'Tue': ['English'], 'Wed': [...
2  [(Mon, Math), (Wed, Science), (Wed, English)]   Ann   {'Mon': ['Math'], 'Wed': ['English', 'Science']}
0 голосов
/ 16 мая 2018

Вы можете использовать defaultdict примерно так:

from collections import defaultdict

def tuple_to_dict(tuples):
    d = defaultdict(list)

    for k, v in tuples:
        d[k].append(v)
    return d

df_in['Classes'] = df_in['Classes'].apply(tuple_to_dict)

df_in
#                                             Classes  Name
#0  {u'Mon': [u'Math', u'Science'], u'Tue': [u'Eng...  Isha
#1  {u'Tue': [u'English'], u'Mon': [u'Math'], u'We...   Amy
#2  {u'Mon': [u'Math'], u'Wed': [u'Science', u'Eng...   Ann

Сроки map против apply:

df = pd.concat([df_in] * 10000)

%timeit df['Classes'].apply(tuple_to_dict)
# 41.2 ms ± 872 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df['Classes'].map(tuple_to_dict)
# 39.2 ms ± 945 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...