2016-11-01 9 views
1

私は300万行と1,200個の "グループ"を持つデータセットを扱っています。Python - 列の値(またはサブセット)に基づいたグループ化(またはループ)

LastName FirstName 

Smith  Rachael 
Smith  John 
Smith  Rachael 
Johnson  Bob 
Johnson  Laura 
Johnson  Laura 

私は別に、各姓を見たい、とそれぞれの姓内の最初の名前に何かをする:ここでは

は、データセットは次のようになります。たとえば、Smithの姓の中で最も普及しているファーストネームを見つけて、それを独自のカラムとして追加することができます(実際はそれよりもはるかに複雑です)。私はすべての行をそのままにする必要があります(言い換えれば、すべてのスミスとすべてのジョンソンを守る必要があります)。

LastName FirstName HighestFreq 

Smith  Rachael  Rachael 
Smith  John  Rachael 
Smith  Rachael  Rachael 
Johnson  Bob   Laura 
Johnson  Laura  Laura 
Johnson  Laura  Laura 

最良の方法は、1200個のデータセットに設定されたデータを分割して、最後に戻って一緒にマージしたり、ループのいくつかの種類を行うのであれば、私は知りません。私はPythonの初心者であり、正しく実行する方法を見つけ出すことができませんでした。私は個々の行を見るために必要なコードを見つけました。ちょうど一度に1つの姓だけを見る方法です。

サブセット化が最善の方法である場合、私は明らかに1,200個のデータセットを手動で命名するつもりはないので、ループのセットに名前を付ける必要があります。

読んでいただきありがとうございます。

+0

1,200個のデータセットを作成する必要はありませんが、なぜそうは思わないのでしょうか。関心のあるカテゴリで元のデータセットをソートすることは、常に良いスタートです(データセットがメモリを保持するのに大規模である場合は、それほど簡単ではありません)。ソート後、あるカテゴリーのすべてのカウントを変数で保持する可能性が最も高くなります。 –

答えて

1

あなたはgroupbytransformを使用し、各グループの中で最も頻度の高いアイテムを取得するためにindexvalue_counts()機能を使用することができ、返される結果の長さを保つために:

df['HighestFreq'] = (df.groupby('LastName')['FirstName'] 
         .transform(lambda g: g.value_counts().index[0])) 
df 

​​

+0

このソリューションはNumPyに基づいており、システム依存性が必要なためNumPyは利用できない可能性があります。しかし、あなたにとって根本的なメモリ管理の問題を解決する何かを使うのは良い考えです。私はsqliteを考えていましたが、 "純粋な" Pythonの中で最も良い解決策が何であるか考え続けました。 –

+2

私はパンダのライブラリの下のフードについてよく分かりませんが、このソリューションはパンダを使用しています。私はパンダがナンシーに依存していると信じています。パンダをインストールするときにそれをインストールする必要がありますか? – Psidom

+0

申し訳ありませんが、質問にパンダのタグが表示されませんでした。 –

0

ここだけPandasがない場合(パンダとの以下を参照):

UnixコマンドまたはPythonを使用して、グループ化するカテゴリ別にファイルを並べ替えますスクリプトはこちらsorting large text dataを参照してください。

ソートされたファイルを反復し、各カテゴリに必要なメトリックを取得します。カテゴリのインスタンスはすべて互いに隣り合っているため、結果をメモリに保持するだけで済みます。

並べ替えをスキップしたい場合は、ファイルを何度も反復することもできます(遅いかもしれません)。中間結果をディスクに保存するというあなたの考えは当然のことです。

高度な読み方:これは基本的にmap-reduce-operationです。サブグループを作成して別々に処理し、結果を統合します。

関連する問題