Порядок категориальных переменных в Пандах - PullRequest
2 голосов
/ 11 октября 2019

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

Input DataFrame

, где a, b, c, d - это категориальные переменные, такие что a < b < c < d иb > 3 * a, c > 2 * b и d > 1.5 * c. Если даны эти явные отношения, как мне добавить строки в этот фрейм данных со всеми другими неявными отношениями, такими как c > 6 * a, d > 9 * a и d > 3 * b.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

как прокомментировано, это проблема с графиком:

df = pd.DataFrame({'0': {0: 'a', 1: 'b', 2: 'c'},
 '1': {0: 'b', 1: 'c', 2: 'd'},
 '2': {0: 3.0, 1: 2.0, 2: 1.5}})

# as we multiplying, we convert the values to log
df[2] = np.log(df[2].astype(float)).astype(float)

# create the graphs
G = nx.DiGraph()

# add the edges
G.add_weighted_edges_from([(x,y,w) for 
                               x,y,w in zip(df[0],df[1],df[2])])

# compute all the path:
np.exp(pd.concat([pd.DataFrame(y, index=[x]) for x,y in
            nx.all_pairs_dijkstra_path_length(G)],
          sort=False)
         .replace(0, np.nan)
         .stack()

      )

Вывод:

a  b    3.0
   c    6.0
   d    9.0
b  c    2.0
   d    3.0
c  d    1.5
dtype: float64
1 голос
/ 11 октября 2019

Предположим, у вас есть кадр данных, как показано ниже (я добавил имена столбцов для удобства чтения)

df
  Cat1 Cat2  Relationship
0    a    b           3.0
1    b    c           2.0
2    c    d           1.5

Первое слияние df само по первым 2 столбцам и вычислите новое значение отношения, умножив исходные 2 значения отношенияна объединенном ряду. Повторяйте то же самое, пока все отношения не достигнут.

import pandas as pd
df = pd.DataFrame(data=[['a', 'b', 3],
                        ['b', 'c', 2],
                        ['c', 'd', 1.5]],
                  columns=['Cat1', 'Cat2', 'Relationship'])
max_length_of_relationships = len(df)
for i in range(max_length_of_relationships):
    df2 = df.merge(df, left_on='Cat2', right_on='Cat1')
    df2['Relationship'] = df2['Relationship_x'] * df2['Relationship_y']
    df2 = df2[['Cat1_x', 'Cat2_y', 'Relationship']]
    df2.columns = ['Cat1', 'Cat2', 'Relationship']
    df = df.append(df2).drop_duplicates()

, что приводит к

df
  Cat1 Cat2  Relationship
0    a    b           3.0
1    b    c           2.0
2    c    d           1.5
0    a    c           6.0
1    b    d           3.0
1    a    d           9.0

Хитрость здесь в том, что я предположил, что max_length_of_relationships - это число строк в кадре данных, котороена самом деле худший вариант развития событий. Если у вас большой фрейм данных, а max_length_of_relationships невелик, производительность будет плохой. В этом случае вам может понадобиться использовать networkx , как предложено @Quang, чтобы найти самый длинный путь в графе.

Пример кода

import networkx as nx
G=nx.from_pandas_edgelist(df, 'Cat1', 'Cat2', edge_attr=True, create_using=nx.DiGraph())
print(nx.dag_longest_path(G))
max_length_of_relationships = nx.dag_longest_path_length(G)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...