2016-05-21 13 views
1

私はヴィンテージデータベースに格納されている非常に大きなデータセットを持っています。私はそれらを人間が読める形式(YAMLまたはJSON)に展開したいと思います。ここでの主な目標は、類似のエントリをグループ化することによって冗長性を避けることです。Pandasを使用して同様のエントリをグループ化してマージする

私のデータは次のように要約することができます。目標は、カラムabによってグループにある

raw = [{'a': 1, 'b': 2, 'c': 3, 'd': 4}, 
     {'a': 1, 'b': 3, 'c': 3, 'd': 4}, 
     {'a': 1, 'b': 4, 'c': 6, 'd': 4}, 
     {'a': 2, 'b': 2, 'c': 9, 'd': 9}, 
     {'a': 2, 'b': 3, 'c': 3, 'd': 4}] 

、その後、一緒に類似したエントリを組み合わせる:キー23がある

data = { 
1: { 
    '2,3': {c:3, d:4}, 
     4: {c:3, d:4} 
    }, 
2: { 
     2: {c:9, d:4}, 
     3: {c:3, d:4} 
    }, 
} 

お知らせコンマで結合されています。

結局、私の出力ファイルは、次のようになります。

%YAML 1.2 
--- 
1: 
    2,3: 
     c: 3 
     d: 4 
    4: 
     c: 6 
     d: 4 
2: 
    2: 
     c: 9 
     d: 4 
    3: 
     c: 3 
     d: 4 

処理を行うと、パンダを使用してdata辞書を取得するのは簡単でしょうか?私は次のようにそれを使用します一日の終わりに

data = fetch_data(sql_query, groupby=('a', 'b'), group_similar='c') 

答えて

1

あなたは可能性:

k = ['a', 'b'] 
result = {i: {} for i in df[k[0]].unique()} 
for vals, data in df.set_index(k).groupby(list(df.drop(k, axis=1).columns)): 
    for a, df_a in data.groupby(level=k[0]): 
     res = df_a.reset_index(k[0], drop=True).to_dict('index') 
     keys = ','.join(map(str, tuple(res.keys()))) 
     result[a].update({keys: list(res.values())[0]}) 

取得する:

{1: 
    {'2,3': {'c': 3, 'd': 4}, 
     '4': {'c': 6, 'd': 4}}, 
2: { '3': {'c': 3, 'd': 4}, 
     '2': {'c': 9, 'd': 9}} 
} 
+0

私は完全に理解するには時間が必要になりますそれ。これは素晴らしいコードです。つまり、フィールド「c」または「d」が空の*つまり「None」のときは機能しません。その場合、 'df.set_index(k).groupby(list(df.columns.drop(k)))'は反復しません。 – nowox

+0

です。サンプルデータに含まれていない他の条件がありますか? Btw、 'drop(k)'は 'axis = 1'を必要とし、' columns'は '.drop()'の後に来るべきだと思います。 – Stefan

+0

サンプルデータはスカラー型 'str'、' numeric'、 'boolean'を混在させることができます。キーは数字または文字列のいずれかです。私は条件のすべてだと思う。 – nowox

関連する問題