2016-09-18 16 views
1

私はデータフレームをスライスする方法を決定しようとここで少しこだわっています。groupby条件に基づいてデータフレームから値を削除する

data = {'Date' : ['08/20/10','08/20/10','08/20/10','08/21/10','08/22/10','08/24/10','08/25/10','08/26/10'] , 'Receipt' : [10001,10001,10002,10002,10003,10004,10004,10004], 
    'Product' : ['xx1','xx2','yy1','fff4','gggg4','fsf4','gggh5','hhhg6']} 

dfTest = pd.DataFrame(data) 
dfTest 

これが生成されます:私は領収書を意味する、唯一のユニークな領収書が含まれている新しいデータフレームを作成したい

Date Product Receipt 
0 08/20/10 xx1 10001 
1 08/20/10 xx2 10001 
2 08/20/10 yy1 10002 
3 08/21/10 fff4 10002 
4 08/22/10 gggg4 10003 
5 08/24/10 fsf4 10004 
6 08/25/10 gggh5 10004 
7 08/26/10 hhhg6 10004 

はわずか1日に使用する必要があります(それが複数回表示することができます1日で)。複数の日に領収書が表示される場合は、削除する必要があります。上記のデータ・セットは、次のようになります。

Date Product Receipt 
0 08/20/10 xx1 10001 
1 08/20/10 xx2 10001 
2 08/22/10 gggg4 10003 

私がこれまでに行っていることである。

dfTest.groupby(['Receipt','Date']).count() 

       Product 
Receipt Date  
10001 08/20/10 2 
10002 08/20/10 1 
     08/21/10 1 
10003 08/22/10 1 
10004 08/24/10 1 
     08/25/10 1 
     08/26/10 1 

私は構造のようなもので、その日のためのクエリを実行する方法を知りませんでした、私はインデックスをリセットしました。

df1 = dfTest.groupby(['Receipt','Date']).count().reset_index() 


Receipt Date Product 
0 10001 08/20/10 2 
1 10002 08/20/10 1 
2 10002 08/21/10 1 
3 10003 08/22/10 1 
4 10004 08/24/10 1 
5 10004 08/25/10 1 
6 10004 08/26/10 1 

今後の進め方についてはわかりません。誰かが救いの手を貸してくれることを願っています。これは簡単かもしれない、私はちょっと混乱しているか、経験が足りない。

答えて

1

あなたが条件使用Series.isinboolean indexingSeriesGroupBy.nuniqueを使用することができます。

df1 = dfTest.groupby(['Receipt'])['Date'].nunique() 
print (df1) 
Receipt 
10001 1 
10002 2 
10003 1 
10004 3 
Name: Date, dtype: int64 

#get indexes of all rows where length is 1 
print (df1[df1 == 1].index) 
Int64Index([10001, 10003], dtype='int64', name='Receipt') 

#get all rows where in column Receipt are indexes with length 1 
print (dfTest[dfTest['Receipt'].isin(df1[df1 == 1].index)]) 
     Date Product Receipt 
0 08/20/10  xx1 10001 
1 08/20/10  xx2 10001 
4 08/22/10 gggg4 10003 

条件でインデックスを検索し、locDataFrameを選択する別の解決策:

print (dfTest.groupby(['Receipt']).filter(lambda x: x.Date.nunique()==1).index) 
Int64Index([0, 1, 4], dtype='int64') 


df1 = dfTest.loc[dfTest.groupby(['Receipt']).filter(lambda x: x.Date.nunique()==1).index] 
print (df1) 
     Date Product Receipt 
0 08/20/10  xx1 10001 
1 08/20/10  xx2 10001 
4 08/22/10 gggg4 10003 
関連する問題