Я хочу объединить этот фрейм данных сам с собой, получить общую длину заказов, длину уникальных значений для столбцов и список уникальных значений для клиентов. Затем я хочу отсортировать по убыванию длины заказов и по возрастанию длины столбцов. Но мне также следует сохранить исходную версию комбинации. В этой ситуации я сделал следующее:
Я хочу спросить:
Могу ли я сделать это, пока процесс объединения еще продолжается, при условии, что он более эффективен? Например, я знаю, что такой функции нет, но представляю себе что-то вроде этого:
Или есть ли способ сделать весь процесс более эффективным? Процесс создания значения sorted_cross_combine занимает около 20 секунд для списка vals, содержащего примерно 6500 элементов.
Вы можете скачать примеры данных по ссылке. Вам необходимо привести тип данных следующим образом:
У меня есть кадр данных pandas, подобный следующему: [code]+------------+-------------------+---------+--------+----------+ | process_no | process_durations | columns | orders | customer | +------------+-------------------+---------+--------+----------+ | 0 | 3 | [0] | [3109] | [0] | +------------+-------------------+---------+--------+----------+ | 1 | 100 | [11] | [5855] | [0] | +------------+-------------------+---------+--------+----------+ | 2 | 81 | [8] | [5304] | [0] | +------------+-------------------+---------+--------+----------+ [/code] Я хочу объединить этот фрейм данных сам с собой, получить общую длину заказов, длину уникальных значений для столбцов и список уникальных значений для клиентов. Затем я хочу отсортировать по убыванию длины заказов и по возрастанию длины столбцов. Но мне также следует сохранить исходную версию комбинации. В этой ситуации я сделал следующее: [code]from itertools import combinations from operator import itemgetter
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])] [/code] А вот мой пример вывода, если вы хотите сделать это с пандами, [code]+-----------------------------+-----------------------------+-------------+--------------+-----------+ | 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] | +-----------------------------+-----------------------------+-------------+--------------+-----------+ [/code] Если вы посмотрите на столбцы x1 и x2, [code]orders => [3109] and [5855] columns => [0] and [11] customer => [0] and [0] [/code] [code]order_length => -len([3109] + [5855]) column_length => len(set([0] + [1])) customers => list(set([0] + [0])) [/code] Я хочу спросить: Могу ли я сделать это, пока процесс объединения еще продолжается, при условии, что он более эффективен? Например, я знаю, что такой функции нет, но представляю себе что-то вроде этого: [code]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)) [/code] Или есть ли способ сделать весь процесс более эффективным? Процесс создания значения sorted_cross_combine занимает около 20 секунд для списка vals, содержащего примерно 6500 элементов. Вы можете скачать примеры данных по ссылке. Вам необходимо привести тип данных следующим образом: [code]import ast
data = pd.read_csv('a.csv')
for col in ['columns', 'orders', 'customer']: data[col] = data[col].apply(ast.literal_eval) [/code] Заранее спасибо.
Учитывая приведенный ниже фрейм данных, если строки сгруппированы по имени и фамилии, как я могу найти и создать новые строки для группы, в которой нет строки для каждого типа в списке типов.
Итак, в приведенном ниже примере для Боба Джека будут...