2012-01-20 10 views
3

Python 3のピボット/クロスタブテーブルに最適なソリューションは何ですか?これを行う組み込み関数はありますか?理想的には、外部依存関係のないPython 3のソリューションを探しています。私が漕いデータとGROUPBYフィールドを再配置できるようにしたいPython 3でデータをピボット/クロス集計する方法は?

nl = [["apples", 2 "New York"], 
     ["peaches", 6, "New York"], 
     ["apples", 6, "New York"], 
     ["peaches", 1, "Vermont"]] 

:例えば、ネストされたリストが与え

   apples peaches 
New York  2   6 
Vermont   6   1 

上記の簡単な例であるが、それするソリューションがありますピボットが望まれるたびにitertools.groupbyを使用するより簡単にできますか?理想的には、解決策では、行データを任意の列でピボットすることができます。私はpandasの使用について議論していましたが、外部ライブラリであり、Python 3のサポートが限られていました。

+0

「itertools.groupbyを使用するよりも簡単ですか?それのどこが悪いんだい?あなたはそれについて好きではないものに特化することができますか? "それは外部です"?どのように悪いですか?ソリューションが受け入れられない理由をより明確にすることはできますか? –

+0

ネストされた値のリストを持つ辞書がある場合、特定の値を取り出してこれをピボットすることは全く些細なことではありません。 – drbunsen

+0

"簡単に"私はこのプロセスを単純化する組み込み関数を持つSASやRのような多くの統計言語を考えていました。例えば、Rのplyrパッケージとreshapeパッケージです。 – drbunsen

答えて

1

ここにいくつかの簡単なコードがあります。行/列/総計を提供することは、読者の練習として残されています。

class CrossTab(object): 

    def __init__(
     self, 
     missing=0, # what to return for an empty cell. 
        # Alternatives: '', 0.0, None, 'NULL' 
     ): 
     self.missing = missing 
     self.col_key_set = set() 
     self.cell_dict = {} 
     self.headings_OK = False 

    def add_item(self, row_key, col_key, value): 
     self.col_key_set.add(col_key) 
     try: 
      self.cell_dict[row_key][col_key] += value 
     except KeyError: 
      try: 
       self.cell_dict[row_key][col_key] = value 
      except KeyError: 
       self.cell_dict[row_key] = {col_key: value} 

    def _process_headings(self): 
     if self.headings_OK: 
      return 
     self.row_headings = list(sorted(self.cell_dict.keys())) 
     self.col_headings = list(sorted(self.col_key_set)) 
     self.headings_OK = True 

    def get_col_headings(self): 
     self._process_headings() 
     return self.col_headings 

    def generate_row_info(self): 
     self._process_headings() 
     for row_key in self.row_headings: 
      row_dict = self.cell_dict[row_key] 
      row_vals = [ 
       row_dict.get(col_key, self.missing) 
       for col_key in self.col_headings 
       ] 
      yield row_key, row_vals 

if __name__ == "__main__": 

    data = [["apples", 2, "New York"], 
     ["peaches", 6, "New York"], 
     ["apples", 6, "New York"], 
     ["peaches", 1, "Vermont"]] 

    ctab = CrossTab(missing='uh-oh') 
    for s in data: 
     ctab.add_item(row_key=s[2], col_key=s[0], value=s[1]) 
    print() 
    print('Column headings:', ctab.get_col_headings()) 
    for row_heading, row_values in ctab.generate_row_info(): 
     print(repr(row_heading), row_values) 

出力:

Column headings: ['apples', 'peaches'] 
'New York' [8, 6] 
'Vermont' ['uh-oh', 1] 

this answer参照してください。

そしてthis one、これは私が忘れていたものです。

0

itertools.groupbyがこの問題のために作られました。あなたは、特に標準ライブラリの中で、より良いものを見つけるのは難しいでしょう。

+1

「この問題のために正確に作られました」例えば、いくつかの具体的な証拠を提供する。作業コードですか? –

+0

@ジョンマーチン:今日は後でやるよ。 – bukzor

+0

@BigYellowCactusのいくつかの['itertools.groupby' magic](http://stackoverflow.com/questions/11428271/produce-a-summary-pivot-table)があります。 –

関連する問題