Как я могу агрегировать список или серию, значения которых хранятся как отношения 1: 1? - PullRequest
0 голосов
/ 04 октября 2018

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

            Col1            Col2

row1        A1               A2

row2        A2               A3

row3        A2               A4

row4        A3               A5

row5        B1               B2

row6        B2               A3

Мне нужно определить значения Col1, которые никогда не появятся в качестве значения Col2 (мы будем называть эти MasterValues), и сгенерировать список илистрока с разделителями-запятыми всех значений, связанных с MasterValue.В этом примере A1 и B1 будут MasterValues.

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

                Col1            Col2

row1            A1              A2,A3,A4,A5

row2            B1              B2,A3

Обратите внимание, что существуют тысячи строк, и некоторые значения (например, A3 в этом примере) используются дляболее одного MasterValue.Также важно отметить, что многие значения встречаются более одного раза в Col1 (например, A2 в этом примере), включая некоторые MasterValues.

Первый шаг, который я рассчитывал, состоит в группировке DF по Col1.Затем я решил зациклить и добавить Col2 соответствующим образом.Я перепробовал много вариантов, и это самое близкое, что я получил:

DF = pandas.read_sql(command, connection)
DF2 = DF
DF = DF.groupby('col1', as_index=False).agg({col2: lambda x: ','.join(x)}))

for xrow in DF.itertuples():
    for yrow in DF2.itertuples():
        if yrow[1] in xrow[2]:
            DF.at[xrow[0], 'col2'] = DF.at[xrow[0], 'col2'] + ',' + yrow[2]

Однако это все еще не правильно.Я все еще получаю некоторые значения в Col1, которые не являются MasterValues.Я искал и искал, думал и думал, но безрезультатно.Может ли кто-нибудь помочь мне обернуть голову вокруг логики, необходимой для этого?

1 Ответ

0 голосов
/ 04 октября 2018

Хотите использовать networkx?

import networkx
import pandas as pd

d = {'Col1': {'row1': 'A1',
  'row2': 'A2',
  'row3': 'A2',
  'row4': 'A3',
  'row5': 'B1',
  'row6': 'B2'},
 'Col2': {'row1': 'A2',
  'row2': 'A3',
  'row3': 'A4',
  'row4': 'A5',
  'row5': 'B2',
  'row6': 'A3'}}

df = pd.DataFrame(d)


G = nx.from_pandas_edgelist(df, 'Col1', 'Col2', create_using=nx.DiGraph())

master = [n for n in G.nodes if nx.ancestors(G, n)==set()]
descendants = [list(nx.descendants(G,m)) for m in master]

pd.DataFrame({'col1':master,'col2':descendants})

Вывод:

  col1              col2
0   A1  [A3, A5, A4, A2]
1   B1      [A5, A3, B2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...