#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