Создайте Дикт Средств от Панд - PullRequest
0 голосов
/ 05 декабря 2018

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

    start   stop   duration
0   1       2      1
1   3       4      2
2   2       1      2
3   4       3      0

Я пытаюсь создать словарь с парами ключ = (начало, остановка) и значением = avg их продолжительности, независимо отпорядок.Другими словами, (1,2) и (2,1) будут считаться вхождением пары (1,2).

Желаемый результат: dict_avg= {(1,2):1.5, (3,4):1}

Что такоелучший способ добиться этого?

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

defaultdict

from collections import defaultdict

m = defaultdict(list)

for *t, d in zip(*map(df.get, df)):
    m[tuple({*t})].append(d)

{k: sum(v) / len(v) for k, v in m.items()}

{(1, 2): 1.5, (3, 4): 1.0}
0 голосов
/ 05 декабря 2018

Использование frozenset не быстро, но аккуратно, если вы ищете эффективный способ, проверьте ссылка

df.groupby(df[['start','stop']].apply(frozenset,1).map(tuple)).duration.mean().to_dict()
Out[1048]: {(1, 2): 1.5, (3, 4): 1.0}
0 голосов
/ 05 декабря 2018

Это также один из способов:

# sort data based on first two columns
df.iloc[:,:2].values.sort()

# create the dict of mean
df.groupby(['start','stop'])['duration'].mean().to_dict()

{(1, 2): 1.5, (3, 4): 1.0}
0 голосов
/ 05 декабря 2018

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

>>> grp = df[['start', 'stop']].apply(lambda x: tuple(sorted(x)), axis=1)
>>> df.groupby(grp)['duration'].mean().to_dict()
{(1, 2): 1.5, (3, 4): 1.0}

В качестве заявления об ограничении ответственности я могу почти гарантировать, что это будет значительно медленнее, чем приведенная здесь сортировка NumPy, так как использование lambda в .apply() (и необходимо использовать конструктор sorted() + tuple()) принимает каждый вызов в пространстве Python вместо того, чтобы делать это в Cython / C, как в идеале вы можете сделать через Pandas / NumPy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...