私はこのようなデータセットを持っています(ここで余分なのは複数の余分な列を意味します):
>>> df = pd.DataFrame({'id_police':['p123','p123','p123','b123','b123'],
'dateeffe':['24/01/2018','24/11/2017','25/02/2018','24/02/2018','24/02/2018'],
'date_fin':['23/03/2018','23/12/2017','26/03/2018','25/02/2018','25/02/2018'],
'prime':[0,20,10,20,30],
'prime2':[0,30,10,20,0],
'extra':[12,12,13,15,20],
...
})
###
id_police dateeffe date_fin prime prime2 extra ...
0 p123 24/01/2018 23/03/2018 0 0 12 ...
1 p123 24/11/2017 23/12/2017 20 30 12 ...
2 p123 25/02/2018 26/03/2018 10 10 13 ...
3 b123 24/02/2018 25/02/2018 20 20 15 ...
4 b123 24/02/2018 25/02/2018 30 0 20 ...
各列id_police
で日付(たとえば、2017年、2018年...)を並べ替えたいです。また、各重複で最大プライムを維持する必要がdateeffe
ありdate_fin
、3と4のように同じid_police
です。
これは期待される出力です:
id_police dateeffe date_fin prime prime2 extra ...
0 p123 24/11/2017 23/12/2017 20 30 12 ...
1 p123 24/01/2018 23/03/2018 0 0 12 ...
2 p123 25/02/2018 26/03/2018 10 10 13 ...
3 b123 24/02/2018 25/02/2018 30 20 15 ...
最大のprimeとprime2を見つけるために、私はこれを使用しました:
df = df.groupby(['id_police','dateeffe','date_fin'],as_index=False).agg({'prime':'max','prime2':'max'})
これは私が試したものですが、すべてがグループ化され、余分な列が失われます...
df1 = df.sort_values(['dateeffe','date_fin']).groupby('id_police', as_index=False).apply(lambda x: x)
私はいたるところを見ました、そして私はあなたの助けに感謝します、事前に感謝します!
私は2段階のgroupbyに基づく解決策を思いついた。
の日付による並べ替えを容易にするために、groupby
両方の日付のタイプを次のように変更することから始めましょうdatetime
。
df.dateeffe = pd.to_datetime(df.dateeffe)
df.date_fin = pd.to_datetime(df.date_fin)
2番目の部分は、集計関数の辞書を作成するためのWen-Benによるソリューションのコピーです(スマートソリューション、他の方法で行う必要はありません)。
d = {'prime': 'max', 'prime2': 'max'}
d1 = dict.fromkeys(df.columns.difference(
['id_police', 'dateeffe', 'date_fin', 'prime', 'prime2']), 'first')
d.update(d1)
次にgroupby
、上記の集計関数を適用して、2番目のステップを含む関数を定義しましょう。
def fn(xx):
return xx.groupby(['dateeffe', 'date_fin'], as_index=False).agg(d)
そして、行うべき唯一のことは、実際の計算、つまり、上記で定義されgroupby
た2番目のステップを適用する最初のステップgroupby
です。
df.groupby('id_police', sort=False).apply(fn)\
.reset_index(level=1, drop=True).reset_index()
両方のgroupby
場合の違いに注意してください。
groupby
はが含まれているsort=False
ため、の元の順序id_police
が維持されます。groupby
はsort
引数がないため、このグループ化により、両方の日付でソートが処理されます。そして、の両方の呼び出しに関する少しの説明reset_index
:
df.groupby('id_police', sort=False).apply(fn)
次の多重指数を持つDataFrameを生成します。
id_police
p123 0
1
2
b123 0
最初にreset_index
完全に削除し、レベル1(0、1、2、0)( drop=True
)。
しかし、第二には、reset_index
実際には、残りのインデックスレベル(変化P123、P123、P123、B123正規カラムに)を、デフォルトのインデックス(0から連番)を作成します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加