2013-06-09 8 views
9

私のデータの一部は次のようになります。私はPythonのパンダ - 合併ほとんど重複行

data.set_index(['date', 'name']) 

を実行することができますポイントを取得しようとしている。しかし、などのデータとしています

date, name, value1, value2, value3, value4 
1/1/2001,ABC,1,1,, 
1/1/2001,ABC,,,2, 
1/1/2001,ABC,,,,35 

- もちろん、上記のように重複があるので、私はこれを行うことはできません(重複したインデックスを必要としません。データを失うので、単にdrop_duplicates()することはできません)。

特定の値がNaN(combine_first()の動作に似ています)に基づいて正常に収束できる場合、同じ[日付、名前]値を持つ行を強制的に1行にすることができます。 。二つの値が異なっていると1がNaNでない場合は、例えば、上記

date, name, value1, value2, value3, value4 
1/1/2001,ABC,1,1,2,35 

で終わるだろう、2行が(これはおそらく、私がフォローアップする必要がありますエラーになります)収束するべきではありません。

(上記の例を拡張するために、実際にはラインの任意の数が存在してもよい - 列の任意の数の所与 - 。1行に収束することができなければならない)

これは感じますパンダを介して非常に解決しなければならない問題のようなものですが、私は優雅な解決法を見つけ出すのに苦労しています。

答えて

11

いくつかの関数combine_itがあるとしましょう。値が重複する行のセットがある場合は、単一の行を返します。まず、datenameによってグループ:

result = grouped.agg(combine_it) 

あなたはまたaggを渡すことで、異なる列に対して異なる集計機能を提供することができます

grouped = data.groupby(['date', 'name']) 

それからちょうど設定が完了し集計関数とブームを適用dict。

+0

ありがとうございます、これは間違いなく重要なステップを削減します。これを行うには特に効率的なイディオムはありますか?私の経験(そしてあなたの提案を使った最初のテスト)では、.agg()は本当に遅い実行につながる可能性があります(おそらく驚くことではありません)。多分避けられないだろうか? – severian

+0

おそらく? (cythonized関数を使用して)速度を上げるために、numpyの組み込み関数( "sum"、 "max"など)を使用してみることもできます。これはおそらく、通常、groupbyの通常の使用例の範囲外です。なぜなら、DataFrameの合計サイズに対して多くのグループがある可能性があるからです。 –

+0

まあ、別の答えを除いて、少なくとも私はあまりにも明白なものを見逃していないことを知っています... – severian

0

数値フィールドの値を持たない場合は、count、min、sumなどを使用して集計することも、可能でも賢明でもありません。それにもかかわらず、1つまたは複数の主キーに基づいて、重複レコードを個々のレコード(たとえば)に折りたたみたいことがあります。 1つ以上の列と崩壊によって

# Firstly, avoid Nan values in the columns you are grouping on! 
df[['col1', 'col2']] = df[['col1', 'col2']].fillna('null') 


    # Define your own customized operation in pandas agg() function 
df = df.groupby(['col1', 'col2']).agg({'SEARCH_TERM':lambda x: ', '.join(tuple(x.tolist())), 

            'HITS_CONTENT':lambda x: ', '.join(tuple(x.tolist()))} 
            ) 

グループは、タプルし、最終的に文字列に、一覧表示するには、最初にそれらを変換することにより、値を値。必要に応じて、各フィールドにリストまたはタプルを保存したり、aggに適用したりすることもできます。関数と辞書は異なる列に対して非常に異なる操作を実行します。

関連する問題