Pandas Группирует по значениям и объединяет строки

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, и я хочу объединить строки, содержащие одинаковые значения

 toy = [
    [10, 11],
    [21, 22],
    [11, 15],
    [22, 23],
    [15, 33]
]

toy = pd.DataFrame(toy, columns = ['ID1', 'ID2'])
  
     ID1 ID2
0   10  11
1   21  22
2   11  15
3   22  23
4   15  33
  

То, что я надеюсь получить впоследствии, это

     0   1   2   3
0   10  11  15  33.0
1   21  22  23  NaN
  

Итак, объединение строк, содержащих любое одинаковое значение внутри.

Мое решение очень НЕ элегантное, я ищу правильный способ сделать это… Рекурсия? Groupby? Хм..

 #### Feel Free to NOT read this... ###
for k in range(100):
    print(k)

    merge_df = []
    merged_indices = []
    for i, row in toy.iterrows():
        if i in merged_indices:
            continue
        cp = toy.copy()
        merge_rows = cp[cp.isin(row.values)].dropna(how="all")
        merged_indices = merged_indices   list(merge_rows.index)
        merge_rows = np.array(toy.iloc[merge_rows.index]).flatten()
        merge_rows = np.unique(merge_rows)
        merge_df.append(merge_rows)

    if toy.shape[0] == len(merge_df):
        break
    toy = pd.DataFrame(merge_df).copy()   
  

Комментарии:

1. Кстати, хорошая картинка с вызывающим 🙂

2. @Wen-Ben хаха — спасибо, мне тоже нравится твоя Сайтама 🙂

Ответ №1:

Звучит как проблемы с сетью, поэтому я использую networkx

 import networkx as nx 
G=nx.from_pandas_edgelist(toy, 'ID1', 'ID2')
l=list(nx.connected_components(G))
newdf=pd.DataFrame(l)
newdf
Out[896]: 
    0   1   2     3
0  33  10  11  15.0
1  21  22  23   NaN