前提・実現したいこと
tsvを、pandas.DataFrameで読み込み、以下のように二列の要素の組み合わせの頻度を求めて、
組み合わせと頻度のデータフレームを作成したいと考えています。
元のデータ(tsv)
new | old |
---|---|
800 | 800 |
800 | 800 |
800 | 800 |
800 | 900 |
900 | 900 |
900 | 1000 |
1000 | 800 |
1000 | 900 |
1000 | 900 |
1000 | 1000 |
作成したいデータフレーム
new | old | freq |
---|---|---|
800 | 800 | 3 |
800 | 900 | 1 |
900 | 900 | 1 |
900 | 1000 | 1 |
1000 | 800 | 1 |
1000 | 900 | 2 |
1000 | 1000 | 1 |
tsvファイルは4列x2,000,000行前後のものが1000ファイルあります。
(一つのtsvファイルに上記の元データの形のデータが横に二つ並んでいるような状態です。)
(1列目と3列目、2列目と4列目の組み合わせの頻度を独立に求めるつもりです。)
要素には200 ~ 1000の数値が入っています。
発生している問題・エラーメッセージ
試しに1ファイルでやってみましたが、読み込みに30秒くらいかかってしまいました。
頻度の列を求めようとすると、五分くらいかかり、tsvファイルが大きいときはブラウザが落ちてしまいます(Jupyter notebookを使っています)。
このままでは1000ファイルを読み込んで一つの頻度列を求められず困っております。
該当のソースコード
Python3
1import os 2import pandas as pd 3 4#ファイル名のリスト作成 5path = "./demo/" 6files = os.listdir(path) 7files_file = [f for f in files if os.path.isfile(os.path.join(path, f))] 8 9#データフレーム初期化 10df1 = pd.DataFrame(index=[], columns=[]) 11df2 = pd.DataFrame(index=[], columns=[]) 12 13# データ読み込み 14def load(df1,df2): 15 for f in files_file: 16 #./demoのtsvを読み込む。ヘッダーは無い。 17 df_tmp = pd.read_table('./demo/'+ f, header = None) 18 #1列目と3列目が対応 19 df_tmp1 = df_tmp.iloc[:,[0,2]] 20 df_tmp1 = df_tmp1.rename(columns={0: 'new', 2: 'old'}) 21 #縦につなげる 22 df1 = pd.concat([df1, df_tmp1]) 23 #2列目と4列目が対応 24 df_tmp2 = df_tmp.iloc[:,[1,3]] 25 df_tmp2 = df_tmp2.rename(columns={1: 'new', 3: 'old'}) 26 #縦につなげる 27 df2 = pd.concat([df2, df_tmp2]) 28 29 print(df.head().append(df.tail())) 30 return df1, df2 31 32df1, df2 = load(df1,df2) 33 34#表示 35df = load()
new | old | |
---|---|---|
0 | 864 | 864 |
1 | 849 | 849 |
2 | 849 | 849 |
3 | 849 | 849 |
4 | 849 | 849 |
20308038 | 849 | 849 |
20308039 | 849 | 849 |
20308040 | 864 | 865 |
20308041 | 855 | 856 |
20308042 | 864 | 865 |
Python3
1# 二つの要素を文字列に変換して結合した列をつくる 2df1['comb'] = df1['new'].astype(str) + df1['old'].astype(str) 3# 結合した文字列の頻度を数えて、vcに入れる 4vc = df1['comb'].value_counts() 5vc
試したこと
上記のように、数値を文字列に変換して結合することで、組み合わせのユニークさを評価できる要素を作りましたが、ここで非常に時間がかかってしまうようです。
数値の組み合わせの頻度をカウントするいい方法はありませんでしょうか?
補足情報(FW/ツールのバージョンなど)
Python 3.6.3
Jupyter notebook 4.4.0

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/06 00:31