Как найти, если две строки столбца существуют на основе другого столбца в DataFrame? - PullRequest
1 голос
/ 13 марта 2020

У меня есть DF,

   name  Id
0  ABC   i1
1  ABC   i2
2  PQR   i3
3  XYZ   i1
4  XYZ   i2

Я хочу найти name с одинаковыми по крайней мере двумя Id с. Я хочу построить график с взвешенными ребрами, и вес зависит от того, имеют ли два или более Id с более чем одним именем.

Итак, в этом примере будут i1 и i2, имеющие ABC и XYZ общие.

Я пытался добиться этого с помощью мультииндексирования int Pandas, где я создал новый DF, подобный следующему:

Id   name
i1   ABC
     ABC
i3   PQR
i2   XYZ
     XYZ

С этого момента я полностью потерян. Спасибо!

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

   Id1 Id2   count
0  i1  i2    2
1  i3  Null  Null

count будет количество раз Id s i1 и i2 с числом name общий

EDITED DF

   name  Id
0  ABC   i1
1  ABC   i2
2  PQR   i3
3  XYZ   i1
4  QWE   i2

########## Входной DF, используемый для экспериментов (dups_df)

   name  Id
0  ABC   i1
1  ABC   i2
2  QWE   i1
3  PQR   i3
4  XYZ   i2

РЕЗУЛЬТАТЫ Из этого DF dups_df['UniqueID'] = dups_df['Id'].map(node2id)

   name  Id  UniqueId
0  ABC   i1  1
1  ABC   i2  1
2  QWE   i1  1
3  PQR   i3  2
4  XYZ   i2  1

dups_df=dups_df.groupby('UniqueID').agg({'name':'nunique', 'Id':'unique'})

UniqueId  Name   Id
1         3      [i1,i2]
2         1      i3
df1 = pd.DataFrame(dups_df.pop('investors_uuids').tolist()).rename(columns= lambda x: "investors_uuids{}".format(x+1))
df1['count'] = dups_df['organization_name'].mask(dups_df['organization_name'].lt(2)).to_numpy()

**outputs**
  Id1  Id2  count
0 i1   i2   3
1 i3   None NaN

Последний вывод DF неверен, счетчик с индексом 0 должен быть равен NaN или 1, поскольку в новом определенном DF abouve с именем dups_df нет других name общих значений, общих для i1 и i2, за исключением ABC, поэтому количество должно быть 1 или NAN, а не 3!

Моя проблема У меня есть столбцы идентификаторов и имен, я хочу построить сетевой график, где я соединяю два идентификатора с ребром и весом Край определяется, если два идентификатора (узла) имеют более одного имени.

1 Ответ

4 голосов
/ 13 марта 2020

Используйте networkx с connected_components:

import networkx as nx

# Create the graph from the dataframe
g = nx.Graph()


g.add_edges_from(df[['name','Id']].itertuples(index=False))

connected_components = nx.connected_components(g)

#create dict for common values
node2id = {}
for cid, component in enumerate(connected_components):
    for node in component:
        node2id[node] = cid + 1

df['UniqueID'] = df['Id'].map(node2id)
print (df)

0  ABC  i1         1
1  ABC  i2         1
2  PQR  i3         2
3  XYZ  i1         1
4  XYZ  i2         1

Затем агрегируйте DataFrameGroupBy.nunique и SeriesGroupBy.nunique создание объявления новый DataFrame:

df = df.groupby('UniqueID').agg({'name':'nunique', 'Id':'unique'})
print (df)
          name        Id
UniqueID                
1            2  [i1, i2]
2            1      [i3]

df1 = pd.DataFrame(df.pop('Id').tolist()).rename(columns = lambda x: f'Id{x+1}')
df1['count'] = df['name'].mask(df['name'].lt(2)).to_numpy()
print (df1)
  Id1   Id2  count
0  i1    i2    2.0
1  i3  None    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...