Рекурсивное иерархическое объединение в Python DataFrame

Если вы можете себе это позволить, JSmooth , похоже, делает то, что вам нужно. Последнее выпущено в 2007 году. Заметка о ее лицензии, взятой из самого приложения:

Сгенерированный исполняемый файл (пусковые установки, созданные JSmooth) находятся под LGPL с «исключением во время выполнения», аналогичным исключению лицензии gcc: не требуется, чтобы вы распространяли с ним исходный код, и что вы публикуете уведомление о jsmooth.

При использовании JSmooth существует раздел с надписью «Скелет», который позволяет вам выбрать некоторые предварительные Определенные параметры. Один из них - «Windowed Wrapper», который подходит для приложений GUI, описанных ниже:

Этот скелет обертывает приложения GUI.

  • Нет консольных входов / выходов отображается
  • Если виртуальная машина Java не найдена, она может отображать настраиваемый URL (обычно на странице загрузки java).

Аргументы могут быть переданы в (либо использовать механизм аргументов JSmooth по умолчанию, либо создать ярлык с аргументами).

Важным в этом скелете является проверка опции «Запустить java-приложение в процессе exe», которое приводит к запуску JVM в том же процессе, что и exe wrapper. Это означает, что в диспетчере задач Windows отображается только exe, в отличие от exe и java-процесса.

Альтернативой является создание собственной оболочки. См. этот справочник Oracle о том, как вызвать JVM из собственного приложения.

0
задан Kash 2 March 2019 в 20:17
поделиться

1 ответ

Вы можете сделать наложение на диктофон emp_id на mgr_id, а затем сделать рекурсивную функцию, такую ​​как

idmap = dict(zip(df['emp_id'], df['mgr_id']))
def depth(id_):
    if np.isnan(id_):
        return 1
    return depth(idmap[id_]) + 1

, чтобы вычислить глубину с учетом id. Чтобы сделать его более эффективным (не повторяя вычисления для одного и того же id), вы можете использовать запоминание (обрабатывается декоратором @functools.lru_cache ниже):

import numpy as np
import pandas as pd
import functools
nan = np.nan
df = pd.DataFrame({'emp_id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'fn': ['Matthew', 'John', 'Chris', 'Sergey', 'Andrey', 'Karen', 'Tri', 'Drew', 'BD', 'Sreedhar'], 'ln': ['Reichek', 'Cottone', 'Winter', 'Bobkov', 'Botelli', 'Goetz', 'Pham', 'Thompson', 'Alabi', 'Kavali'], 'mgr_id': [nan, 3.0, 1.0, 2.0, 2.0, 7.0, 3.0, 7.0, 7.0, 7.0]})

def make_depth(df):
    idmap = dict(zip(df['emp_id'], df['mgr_id']))
    @functools.lru_cache()
    def depth(id_):
        if np.isnan(id_):
            return 1
        return depth(idmap[id_]) + 1
    return depth

df['depth'] = df['mgr_id'].apply(make_depth(df))
print(df.sort_values(by='depth'))

yields [ 1111]

   emp_id        fn        ln  mgr_id  depth
0       1   Matthew   Reichek     NaN      1
2       3     Chris    Winter     1.0      2
1       2      John   Cottone     3.0      3
6       7       Tri      Pham     3.0      3
3       4    Sergey    Bobkov     2.0      4
4       5    Andrey   Botelli     2.0      4
5       6     Karen     Goetz     7.0      4
7       8      Drew  Thompson     7.0      4
8       9        BD     Alabi     7.0      4
9      10  Sreedhar    Kavali     7.0      4
0
ответ дан unutbu 2 March 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: