Получить данные в виде списка кортежа из столбца данных - PullRequest
0 голосов
/ 05 февраля 2019

Фрейм входных данных:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4
3    2      2.5
4    1      2.6
5    3      1.6
6    2      2.9
7    0      3.6
8    2      2.7

Ожидаемый результат:

format :   [(id,count_of_value,[value as a list])] i.e like this 
           [ (0,2,[10.2, 3.6]), (1, 2, [5.7, 2.6]). . ]

Пока я могу получить первые дваэлементы, т. е. id, и это считается как кортеж. Также мне нужны были данные в обратном отсортированном порядке,

id_list = df.id.tolist()
count = Counter(uid_list)
ID_count_list = sorted(count.items(), key=operator.itemgetter(1),reverse=True)

Какой самый эффективный способ получить значение, как описано в ожидаемом выводе?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Это проблема groupby.Если списка списков достаточно:

res = df.groupby('id')['value'].agg(['count', lambda x: x.tolist()])\
        .reset_index().values.tolist()

print(res)

# [[0, 2, [10.2, 3.6]], [1, 2, [5.7, 2.6]],
#  [2, 4, [7.4, 2.5, 2.9, 2.7]], [3, 1, [1.6]]]

Для списка кортежей есть дополнительный шаг:

res = list(map(tuple, res))

print(res)

# [(0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]),
#  (2, 4, [7.4, 2.5, 2.9, 2.7]), (3, 1, [1.6])]
0 голосов
/ 05 февраля 2019

Вы можете использовать groupby + применить , чтобы сделать все это за один шаг, соответствующий желаемому результату:

result = df.groupby('id')['value'].apply(lambda x: (x.name, x.size, x.tolist())).tolist()
print(result)

Выход

[(0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]), (2, 4, [7.4, 2.5, 2.9, 2.7]), (3, 1, [1.6])]

Учитывая приведенный выше вывод, вы можете отсортировать его так:

result = [(0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]), (2, 4, [7.4, 2.5, 2.9, 2.7]), (3, 1, [1.6])]
s = sorted(result, key=operator.itemgetter(1), reverse=True)
print(s)

Вывод (отсортировано)

[(2, 4, [7.4, 2.5, 2.9, 2.7]), (0, 2, [10.2, 3.6]), (1, 2, [5.7, 2.6]), (3, 1, [1.6])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...