Вот ответ без замороженного набора.
df1 = df.apply(sorted, 1)
df_count =df1.groupby(['A', 'B']).size().reset_index().sort_values(0, ascending=False)
df_count.columns = ['A', 'B', 'Count']
df_all = pd.concat([df_count.assign(letter=lambda x: x['A']),
df_count.assign(letter=lambda x: x['B'])]).sort_values(['letter', 'Count'], ascending =[True, False])
df_first = df_all.groupby(['letter']).first().reset_index()
top = int(len(df_count)/4)
df_top_25 = df_count.iloc[:top]
------------ старше ответ --------
С вопросами заказа вы можете использовать замороженный набор в качестве ключа к GroupBy
import pandas as pd
df = pd.read_csv('text.csv', header=None, names=['A','B'], sep=';')
s = df.apply(frozenset, 1)
df_count = s.value_counts().reset_index()
df_count.columns = ['Combos', 'Count']
Что даст вам этот
Combos Count
0 (a, b) 3
1 (b, f) 2
2 (d, c) 2
3 (g, f) 1
4 (b, h) 1
5 (c, g) 1
6 (d, f) 1
7 (e, a) 1
Чтобы получить наибольшее количество комбо для каждой буквы мы конкатенировать этот dataframe поверх себя и сделать еще один который будет содержать либо первую, либо вторую букву.
df_a = df_count.copy()
df_b = df_count.copy()
df_a['letter'] = df_a['Combos'].apply(lambda x: list(x)[0])
df_b['letter'] = df_b['Combos'].apply(lambda x: list(x)[1])
df_all = pd.concat([df_a, df_b]).sort_values(['letter', 'Count'], ascending =[True, False])
А поскольку это сортировано по букве и подсчету (по убыванию), просто получите первый ряд каждой группы.
df_first = df_all.groupby('letter').first()
А чтобы получить верхнюю 25%, просто используйте
top = int(len(df_count)/4)
df_top_25 = df_count.iloc[:top]
И затем использовать .to_csv
для вывода в файл.
Share example output – sirfz
Имеет ли значение вопрос? Например, будут ли 'a; b' и' b; a' быть повторно повторяющейся парой? –
Да, вам нужно точно определить, что такое пара, прежде чем дать ответ. панды были бы хорошим инструментом для этого. –