2 Вопрос: Как объединить связанные строки в группе панд [дубликата]

вопрос создан в Thu, May 2, 2019 12:00 AM
    

На этот вопрос уже есть ответ здесь:

    

Я пытаюсь выяснить, как считать данную комбинацию из 2 строк независимо от того, какая строка является первой /второй.

Вот мой код:

import pandas as pd

mylist = [[('Smith JR', 'Kim YY'), ('Smith JR', 'Ron AA'), ('Kim YY', 'Ron AA')],
          [('Kim YY', 'Smith JR')], [('Smith JR', 'Ron AA')]]

flat_list = [item for sublist in mylist for item in sublist]

df = pd.DataFrame(flat_list, columns=["From", "To"])
df_graph = df.groupby(["From", "To"]).size().reset_index()
df_graph.columns = ["From", "To", "Count"]

print(df_graph)

который дает:

       From        To  Count
0    Kim YY    Ron AA      1
1    Kim YY    Smith JR    1
2  Smith JR    Kim YY      1
3  Smith JR    Ron AA      2

но так как Ким YY Смит JR и Смит JR Ким YY образуют связь между теми же двумя людьми, я хочу, чтобы они дали:

       From        To  Count
0    Kim YY    Ron AA      1
1    Kim YY    Smith JR    2
2  Smith JR    Ron AA      2

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

1    Kim YY    Smith JR    1
2  Smith JR    Kim YY      1

строк, так что остается только строка Ким ГГ - Смита JR, а счетчик равен 2. Кроме того, в моих реальных данных счет может быть больше 1 для данной строки.

    
3
2 ответа                              2                         

Сортируйте два столбца вместе перед добавлением в фрейм данных, чтобы гарантировать, что пара будет отображаться только в определенном порядке. Только тогда примените свой метод подсчета. Использование метода из ссылка для сортировки:

import pandas as pd
import networkx as nx

mylist = [[('Smith JR','Kim YY'),('Smith JR','Ron AA'),('Kim YY','Ron AA')],[('Kim YY','Smith JR')],[('Smith JR','Ron AA')]]

flat_list = [item for sublist in mylist for item in sublist]

df = pd.DataFrame(flat_list, columns=["From", "To"])
#create a new dataframe with the value pairs sorted. You can also sort earlier if you prefer.
df = pd.DataFrame(np.sort(df[["From", "To"]]), columns = ["From", "To"])
#now, just apply the groupby.
df_graph = df.groupby(["From", "To"], axis=0).size().reset_index()
#Output:
     From        To  0
0  Kim YY    Ron AA  1
1  Kim YY  Smith JR  2
2  Ron AA  Smith JR  2
    
5
2019-05-03 18: 50: 06Z

Quick 'n Dirty

Но не так грязно

pd.value_counts([*map(frozenset, zip(df.From, df.To))])

(Smith JR, Ron AA)    2
(Kim YY, Smith JR)    2
(Kim YY, Ron AA)      1
dtype: int64
    
3
2019-05-03 19: 07: 34Z
источник размещен Вот