Как определить новые значения и отсортировать их по этим значениям при объединении списка с самим собой?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как определить новые значения и отсортировать их по этим значениям при объединении списка с самим собой?

Сообщение Anonymous »

У меня есть кадр данных pandas, подобный следующему:

Код: Выделить всё

+------------+-------------------+---------+--------+----------+
| process_no | process_durations | columns | orders | customer |
+------------+-------------------+---------+--------+----------+
| 0          | 3                 | [0]     | [3109] | [0]      |
+------------+-------------------+---------+--------+----------+
| 1          | 100               | [11]    | [5855] | [0]      |
+------------+-------------------+---------+--------+----------+
| 2          | 81                | [8]     | [5304] | [0]      |
+------------+-------------------+---------+--------+----------+
Я хочу объединить этот фрейм данных сам с собой, получить общую длину заказов, длину уникальных значений для столбцов и список уникальных значений для клиентов. Затем я хочу отсортировать по убыванию длины заказов и по возрастанию длины столбцов. Но мне также следует сохранить исходную версию комбинации. В этой ситуации я сделал следующее:

Код: Выделить всё

from itertools import combinations
from operator import itemgetter

data = pd.DataFrame({
'process_no': [0, 1, 2],
'process_durations': [3, 100, 81],
'columns': [[0], [11], [8]],
'orders': [[3109], [5855], [5304]],
'customer': [[0], [0], [0]]
})

vals = data.values.tolist()
cross_combine = list(combinations(vals, r=2))

sorted_cross_combine = sorted(
[
(
x,
-(len(x[0][3]) + len(x[1][3])),
len(set(x[0][2] + x[1][2])),
list(set(x[0][4] + x[1][4]))
)
for x in cross_combine
],
key=itemgetter(1, 2)
)
print(sorted_cross_combine)

[(([0, 3, [0], [3109], [0]], [1, 100, [11], [5855], [0]]), -2, 2, [0]),
(([0, 3, [0], [3109], [0]], [2, 81, [8], [5304], [0]]), -2, 2, [0]),
(([1, 100, [11], [5855], [0]], [2, 81, [8], [5304], [0]]), -2, 2, [0])]
А вот мой пример вывода, если вы хотите сделать это с пандами,

Код: Выделить всё

+-----------------------------+-----------------------------+-------------+--------------+-----------+
| x1                          | x2                          |order_length |column_length | customers |
+-----------------------------+-----------------------------+-------------+--------------+-----------+
| [0, 3, [0], [3109], [0]]    | [1, 100, [11], [5855], [0]] | -2          | 2            | [0]       |
+-----------------------------+-----------------------------+-------------+--------------+-----------+
| [0, 3, [0], [3109], [0]]    | [2, 81, [8], [5304], [0]]   | -2          | 2            | [0]       |
+-----------------------------+-----------------------------+-------------+--------------+-----------+
| [1, 100, [11], [5855], [0]] | [2, 81, [8], [5304], [0]]   | -2          | 2            | [0]       |
+-----------------------------+-----------------------------+-------------+--------------+-----------+
Если вы посмотрите на столбцы x1 и x2,

Код: Выделить всё

orders   => [3109] and [5855]
columns  => [0] and [11]
customer => [0] and [0]

Код: Выделить всё

order_length  => -len([3109] + [5855])
column_length => len(set([0] + [1]))
customers     => list(set([0] + [0]))
Я хочу спросить:
Могу ли я сделать это, пока процесс объединения еще продолжается, при условии, что он более эффективен? Например, я знаю, что такой функции нет, но представляю себе что-то вроде этого:

Код: Выделить всё

def calc(x, y):
return (
x + y,
-(len(x[3]) + len(y[3])),
len(set(x[2] + y[2])),
list(set(x[4] + y[4]))
)

cross_combine = list(combinations(vals, r=2, func=calc))
Или есть ли способ сделать весь процесс более эффективным? Процесс создания значения sorted_cross_combine занимает около 20 секунд для списка vals, содержащего примерно 6500 элементов.
Вы можете скачать примеры данных по ссылке. Вам необходимо привести тип данных следующим образом:

Код: Выделить всё

import ast

data = pd.read_csv('a.csv')

for col in ['columns', 'orders', 'customer']:
data[col] = data[col].apply(ast.literal_eval)
Заранее спасибо.


Подробнее здесь: https://stackoverflow.com/questions/785 ... t-with-its
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»