2016-12-10 3 views
-1

出力ファイルを生成する:カウントライン周波数と、このようなテキストファイルで

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

どのようにそれを読むと、二つの出力テキストファイルを生成することができます。各文字のために最も頻繁に発生するカップルを表す1つの維持が行だけを;最も一般的な文字の上位25%のいずれかを含むすべてのカップルを保持するもの。

ご迷惑をおかけして申し訳ございません。リスト内包、カウント、パンダでたくさんのものを試してみましたが、十分に流暢ではありませんでした。

+2

出力例を共有 – 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への鍵として凍結されたセットを使用することができます

私たちは、それ自体の上に、このデータフレームを連結し、別を行います各文字のための最高のコンボを取得するには、この

にあなた
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 

を与える

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'] 

最初または2番目の文字を保持する列。

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() 

そして、ちょうど

top = int(len(df_count)/4) 
df_top_25 = df_count.iloc[:top] 

を使用して、ファイルに出力する.to_csvを使用し、上位25%を取得します。

+0

ジョブを実行します。ありがとうございました! '.to_csv'ファイルは、' 'frozenset(['a'、 'b']);最初の場合は' '0; frozenset(['a'、 'b']) b ']); 2番目の3'。それらを両方とも 'a; b'形式でヘッダを' source'と 'target'にするスムーズな方法はありますか? – textnet

+1

フリーズしたセットを取り除くには、後半の 'df ['source'] = df ['Combos']。apply(lambda x:list(x)[0])'と 'df [ target '] = df [' Combos ']。apply(lambda x:list(x)[0]) 'そして不要な列を削除します。 –

+0

コード 'df_count = df.groupby(['source'、 'target'])。size()。reset_index()。sort_values(0、ascending = False)'および 'df_count。方向が重要でないように、すなわちa; bがbと一緒に数えられるように、columns = ['source'、 'target'、 'weight'] ' – textnet