2016-06-24 8 views
1

の最初の発生に基づいて、私は、各学生の最初の月から最大値の最初の出現をドロップしたい大きな辞書パンダ - ドロップ行の下の条件

data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams', 
       'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',], 

'year':[2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016], 
'month':[11,11,11,11,12,12,12,12,12,1,1], 
'day':[15,16,21,23,1,2,15,18,30,5,7], 
'BookLevel':[1.5,1.5,1.2,1.4,1.7,1.8,3.2,3.1,3.8,3.3,3.4]} 

のサンプルです。 2回目の出現がある場合は、その出現を維持したい

私はgroupIをStudentId、年、月で計算し、計算された最大値は BookLevelです。

私はその後、私は、次のように見えるデータフレーム持っていた学生一人当たり月額最大値を計算するために、別のデータフレームを行なったし、2つのデータフレームに

を合併:

 StudentId year month BookLevel BookLevelMax 
    0 AAdams 2015 11  1.5   1.5 
    1 AAdams 2015 11  1.5   1.5 
    2 AAdams 2015 11  1.2   1.5 
    3 AAdams 2015 11  1.4   1.5 
    4 AAdams 2015 12  1.7   1.8 
    5 AAdams 2015 12  1.8   1.8 
    6 BBrooks 2015 12  3.2   3.8 
    7 BBrooks 2015 12  3.1   3.8 
    8 BBrooks 2015 12  3.8   3.8 
    9 BBrooks 2016 1  3.3   3.4 
    10 BBrooks 2016 1  3.4   3.4 

を私が最初にドロップしたいですAAdamsの11月に1.5、12月にBBrookの3.8行が発生します

df.dropを使用して、BookLevel MaxとBookLevelが等しい行を削除できます...ただし、学生は、を削除しますは、最初のオカレンスと2番目のオカレンスの両方があります。

 StudentId year month BookLevel BookLevelMax 
    2  AAdams  2015 11  1.2  1.5 
    3  AAdams  2015 11  1.4  1.5 
    4  AAdams  2015 12  1.7  1.8 
    6  BBrooks  2015 12  3.2  3.8 
    7  BBrooks  2015 12  3.1  3.8 
    9  BBrooks  2016 1   3.3  3.4 

最初のオカレンスだけを削除して最初の1か月にのみ行う方法はありません。具体的には、AAdamsは11ヶ月で最大1.5です。これは2つの機会に発生します。私は行の1つを維持したいが、他のものを落としたいと思う。そして、それは2番目の月(そして最初の後の数ヶ月の他の生徒の他の出現)で発生するので、私はAAdamsの下で1.8と行を保ちたい。これが理にかなってほしい。 (上記のように)

答えて

0

元の質問をしてみてください。以下は

がdfdata

data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams', 
      'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',], 

'year':[2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016], 
'month':[11,11,11,11,12,12,12,12,12,1,1], 
'day':[15,16,21,23,1,2,15,18,30,5,7], 
'BookLevel':[1.5,1.5,1.2,1.4,1.7,1.8,3.2,3.1,3.8,3.3,3.4]} 

は、私が最初に出現をドロップしたいとなった大きな辞書のサンプルです各生徒の最初の月の最大値の2回目の出現がある場合は、その出現を維持したい。これはStudentIDの各グループの先頭に最初の月の最高BookLevelをもたらした

df =dfdata.sort_values(by=['StudentId','year','month','BookLevel'],ascending = [True,True,True,False]) 

:これは私の新しいソリューションである私は、各学生のための最初の月以外の月を変更する

を望んでいませんでした、 年月。

私はcumcountを使ってグループバイをしました。これは、最初の月に各生徒の最高レベルのブックレベルの隣にゼロを置いたものです。

df1 = (df.groupby('StudentId').cumcount()) 

は、その後、私は達成ゼロ

df2 = df(df.groupby('StudentId').cumcount() !=0]) 

ミッションなしですべての行を選択GROUPBYをしました! 元の試行は、段階的な進歩を見ても、元の目標を失う素晴らしい例です。

+0

CmariのおかげでJezraelに感謝しました。他の質問へのあなたの答えの組み合わせは私を最終的な解決に導いた –

0

この

# sort and reindex 
df = df.sort('col').reset_index() 

#slice to first occurrence of your value 
df.loc[: df[(df['col'] == 'row')].index[0], :] 
+0

ありがとうございます....私はスライスコマンドFutureWarningについて次のように書きます:要素ごとの比較に失敗しました。代わりにスカラーを返しますが、将来、要素ごとの比較と次のエラーが実行されます。 TypeError:無効な型の比較また、将来の減価償却のためにソート(col)をsort_values(=)に変更しました –