2016-12-10 2 views
-1

С в текстовый файл, например так:частоты Counting линии и производя выходные файлы

a;b 
b;a 
c;d 
d;c 
e;a 
f;g 
h;b 
b;f 
b;f 
c;g 
a;b 
d;f 

Как можно читать, и производить два выходных текстовых файлов: один сохраняемости только линии, представляющие наиболее часто встречающийся пару для каждой буквы ; и один, сохраняющий все пары, которые включают в себя любую из 25% наиболее часто встречающихся букв.

Извините, что не поделились никаким кодом. Пробовал много вещей со списками, подсчетами и пандами, но не достаточно свободно.

+2

Share example output – sirfz

+0

Имеет ли значение вопрос? Например, будут ли 'a; b' и' b; a' быть повторно повторяющейся парой? –

+0

Да, вам нужно точно определить, что такое пара, прежде чем дать ответ. панды были бы хорошим инструментом для этого. –

ответ

1

Вот ответ без замороженного набора.

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 для вывода в файл.

+0

Работает ли. Спасибо! Файлы '.to_csv' выходят с строками, похожими на это: a; frozenset (['a', 'b']); 3 - в первом случае и как этот' 0; frozenset (['a', ' b ']); 3 - во втором. Любой гладкий способ заставить их обоих форматироваться как 'a; b' с заголовками' source' и 'target'? – textnet

+1

Чтобы избавиться от замороженного набора, используйте то, что было сделано во второй половине 'df ['source'] = df ['Combos']. Apply (lambda x: list (x) [0])' и 'df [' target '] = df [' Combos '] применить (lambda x: list (x) [0]) 'и сбросить ненужные столбцы. –

+0

Может ли код 'df_count = df.groupby (['source', 'target']). Size(). Reset_index(). Sort_values ​​(0, ascending = False)' и 'df_count.column = ['source', 'target', 'weight'] 'должны быть изменены так, чтобы направление не имело значения, то есть a; b подсчитывалось вместе с b; a? – textnet

Смежные вопросы