19

私のデータの一部は次のようになります。

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

走れるところまでたどり着こうとしている

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

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

特定の値が NaN であることに基づいて正常に収束できる場合は、同じ [date, name] 値を持つ行を単一の行に強制できるようにしたいと考えています (combine_first() の動作と同様)。たとえば、上記は最終的に

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

2 つの値が異なり、一方が NaN でない場合、2 つの行は収束されません (これはおそらくエラーであり、追跡する必要があります)。

(上記の例を拡張すると、実際には任意の数の行が存在する可能性があり、任意の数の列が与えられた場合、1 つの行に収束できるはずです。)

これは、パンダを介して非常に解決できるはずの問題のように感じますが、エレガントな解決策を見つけるのに苦労しています。

4

4 に答える 4

18

combine_it重複する値を持つ一連の行を指定して、1 つの行を返す関数があるとします。まず、 and でグループ化datenameます。

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

次に、集計関数とブームを適用するだけで完了です。

result = grouped.agg(combine_it)

aggdictを渡すことで、異なる列に異なる集計関数を提供することもできます。

于 2013-06-09T05:14:01.307 に答える
1

agg列単位の値は繰り返されないため、次のような関数のトリックを使用できます。

data.groupby(['date', 'name']).agg('sum')
于 2018-11-30T23:28:16.627 に答える