2017-01-14 10 views
2

この質問は、私がここに投稿した前のものの続編です:Slicing Pandas Dataframe according to number of lines。私は問題を解決したすてきな答えを得ました。それにもかかわらず、解決策を別の方法で試してみると、私は期待したことが得られず、多くのテストにもかかわらず、私は理由を理解できません。盗まれたDataFrameスライス?

「Group」Id(1つのグループには多くのオブジェクトがあります)と数量(「R」など)を含むpandasデータフレームdfがあるとします。私は、少なくとも4つのオブジェクトのグループを持つ別のdfを作成したいと思います。そして、Rでソートされたときの4番目のオブジェクトがR_minよりも低いです(私は、最大 'R_min'を呼び出すには奇妙に聞こえますが、負の値の場合は明るくなり、絶対値が高いほど明るい)。

R_min = -18.8 
df_processed = (df[df.Group.map(df.Group.value_counts().ge(4))] 
    .groupby('Group').filter(lambda x: np.any(x.sort_values('R').iloc[3] <= R_min))) 

enter image description here

I:私の問題を解決するには、完璧に動作しているようです、この1、である

df = pd.DataFrame({ 'R'  : (-21,-21,-22,-3,-23,-24,-20,-19,-34,-35,-30,-5,-25,-6,-7,-22,-21,-10,-11,-12,-13,-14,-15), 
    ....:   'Group': (1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5) }) 

df

:ここでの問題のために構築モックデータフレームです私の拘束の下に残っているのはグループ3だけです。今、私の銀河団のカタログがどのように構造化されているかを確認するために、私は少なくとも4人のメンバーを持つ人のうち何が残っているかを確認します。

df_left = (df[df.Group.map(df.Group.value_counts().ge(4))] 
     .groupby('Group').filter(lambda x: np.any(x.sort_values('R').iloc[3] > R_min))) 

残念ながら、それはしません:ここ

enter image description here

最もstricking点は、グループ3はdf_leftでもあるということで、私は正確に同じように機能するために、次のようなコードを期待します! Rでソートされたグループ3は-35、-34、-30、-19、-5を与え、そのうちの4番目の値は-19で-18.8より小さい。どうして?選択方法が間違っていますか?どうすれば修正できますか?

感謝

+1

リンク先は私から回答を受けました。あなたがそれを指摘したので、それにわずかな誤りがありました。私は必要な変更を加えてその投稿を更新しました。 –

+1

クール、ありがとう! :) – Matt

答えて

1

x.sort_values('R').iloc[3]シリーズがちょうど列Rからなるデータフレームを仕分けし、されていないため、このエラーを受けています。これは、np.anyを呼び出すと、列Groupを含む列のいずれかが、R_minより大きいかどうかを確認していて、すべての値がGroupで正であるため、trueを返します。

あなたのコードも高度に最適ではありません。代わりにこれを行う必要があります:

R_min = -18.8 
df.groupby('Group').filter(lambda x: (x.shape[0] >= 4) & (x['R'].nsmallest(4).iloc[-1] <= R_min)) 
+0

パーフェクト!どうもありがとうございました!私の実際の銀河団のカタログには多くのフィールドがあるので、私の選択が間違っていたことを意味します。あなたのコードは完全に動作し、以前のものよりもはるかに読みやすくなります。ありがとうございました! – Matt

+0

さらに、あなたの説明は非常に明確で、改善に役立ちます。 :) – Matt

関連する問題