RからPythonに移行していますが、次のコードを複製するのに苦労しています。
df = df %>% group_by(ID) %>% slice(seq_len(min(which(F < 1 & d == 8), n()))
サンプルデータ:
ID Price F D
1 10.1 1 NAN
1 10.4 1 NAN
1 10.6 .8 8
1 8.1 .8 NAN
1 8.5 .8 NAN
2 22.4 2 NAN
2 22.1 2 NAN
2 21.1 .9 8
2 20.1 .9 NAN
2 20.1 .9 6
目的の出力で:
ID Price F D
1 10.1 1 NAN
1 10.4 1 NAN
2 22.4 2 NAN
2 22.1 2 NAN
Pythonのコードには、np.where、cumcount()、sliceなどのコードが含まれていると思います。
しかし、私はこれをどのように行うのかわかりません。どんな助けでもいただければ幸いです、ありがとう。
編集:解決策を見つけることを望んで私の質問に来る将来の誰にでも-yatuの解決策はうまくいきました-しかし私はもう少し読みやすいことがわかった別の解決策に自分の道を歩みました:
df['temp'] = np.where((df['F'] < 1) & (df['D'] == 8), 1, 0)
mask = df.groupby(ID)['temp'].cumsum().eq(0)
df[mask]
マスキングについて少し読んだことがありますが、Pythonの複雑さをかなり単純化するのに本当に役立ちます!
次の条件を使用して、データフレームにインデックスを付けることができます。
c1 = ~df.Distro.eq(8).groupby(df.ID).cumsum()
c2 = df.Factor.lt(1).groupby(df.ID).cumsum().eq(0)
df[c1 & c2]
ID Price Factor Distro
0 1 10.1 1.0 NAN
1 1 10.4 1.0 NAN
5 2 22.4 2.0 NAN
6 2 22.1 2.0 NAN
.cumsum
ブール系列をとることにより、本質的にTrue
値を伝播していることに注意してください。したがって、True
が表示されるとすぐに、残りの値はになりますTrue
。否定されたこの結果は、値が表示されるとすぐにデータフレームから行を削除するために使用できます。
詳細
次のデータフレームは、元のデータフレームと、インデックス付けに使用される条件を示しています。この場合、指定された基準が同じ行で行われるとすると、両方の条件が同じ動作を示します。
df.assign(c1=c1, c2=c2)
ID Price Factor Distro c1 c2
0 1 10.1 1.0 NAN True True
1 1 10.4 1.0 NAN True True
2 1 10.6 0.8 8 False False
3 1 8.1 0.8 NAN False False
4 1 8.5 0.8 NAN False False
5 2 22.4 2.0 NAN True True
6 2 22.1 2.0 NAN True True
7 2 21.1 0.9 8 False False
8 2 20.1 0.9 NAN False False
9 2 20.1 0.9 6 False False
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加