2017-05-09 63 views
1

我的問題有點類似於this one,但並不完全。我有以下類型的結構當嘗試刪除重複項時,熊貓只刪除某些列值

| id | entrydate | sales | purchases | 
| -- | -----------| ----- | --------- | 
| 1 | 05/03/2017 | 10 | 1   | 
| 2 | 05/03/2017 | 20 | 2   | 
| 3 | 05/03/2017 | 30 | 3   | 
| 1 | 05/03/2017 | 40 | 1   | 

我讀入數據幀此的CSV,和我想要得到銷售和購買的每日彙總(個人ID無所謂,只是每日彙總)。

首先,我需要刪除重複項。這使我絆倒了,因爲如果你拿上面的例子,對於id 1,同一天有兩個條目,但purchases列中的多個條目被認爲是重複的,而sales列中的多個條目是有效的,所以正確的分組會導致

| id | entrydate | sales | purchases | 
| -- | -----------| ----- | --------- | 
| 1 | 05/03/2017 | 50 | 1   | 
| 2 | 05/03/2017 | 20 | 2   | 
| 3 | 05/03/2017 | 30 | 3   | 

,然後讓每天的總能給我

|entrydate | sales | purchases | 
| -----------| ----- | --------- | 
| 05/03/2017 | 100 | 6   | 

我試圖刪除使用

purchases重複
df = pandas.read_csv('../my-csv.csv', parse_dates=True, dayfirst=True, usecols=my_columns, dtype=my_dtypes).rename(columns=str.lower).assign(date=lambda x: pd.to_datetime(x['entrydate'], format="%d/%m/%Y")).set_index('date') 

enter image description here

df = df.drop_duplicates(['id', 'entrydate', 'purchases']) 
df.drop(['id'], axis=1, inplace=True) 
df = df.groupby(pd.TimeGrouper(freq='D')).sum() 

但同時這將刪除重複purchases它也除去有效sales

enter image description here


圖片用於通過A-ZA-z中的溶液

enter image description here

回答

1

您可以使用GROUPBY兩次,第一次以總銷售

df.sales = df.groupby('id').sales.transform('sum') 
df = df.drop_duplicates() 
df.groupby(df.entrydate).sum().reset_index() 


    entrydate sales purchases 
0 2017-05-03 100  6 

編輯:爲了說明和在不同日期

df.sales = df.groupby(['id', 'date']).sales.transform('sum') 
df = df.drop_duplicates() 
df.groupby('date')['sales', 'purchases'].sum().reset_index() 

你得到

date  sales purchases 
0 2017-03-05 100  6 
1 2017-03-06 40  1 
+0

這幾乎適用於我,除非在csv中存在另一個日期,所以假設我在'1,06/03/2017,40,1'這樣的csv中有一行,它似乎將該id的所有日期的銷售額相加,然後使用該日期所有日期的值。請參閱 –

+1

pl的更新屏幕截圖,以查看編輯 – Vaishali

1

如果GROUPBY entrydate你可以聚合的銷售和採購:

In [11]: df.groupby("entrydate").agg({"sales": "sum", "purchases": "sum"}) 
Out[11]: 
      sales purchases 
entrydate 
05/03/2017 100   7 
+0

對不起,也許我需要整理我的問題。我想總結銷售額,但對於購買,我首先要刪除每個ID的重複條目,然後總和。因此,銷售總額將確實總計爲100,但購買將是6(因爲每個日期每個ID只有一個條目計數) –

+0

@ PhilipO'Brien爲什麼它應該選擇40到30?還是應該採取兩個? –

+0

它應該從銷售欄中獲得(總和),但只從採購欄中獲取一筆(每日採購額總是相同的,因此採用哪一張並不重要) –

0

設置

df = pd.DataFrame({'entrydate': {0: '05/03/2017', 
    1: '05/03/2017', 
    2: '05/03/2017', 
    3: '05/03/2017', 
    4: '06/03/2017', 
    5: '06/03/2017', 
    6: '06/03/2017', 
    7: '06/03/2017'}, 
'id': {0: 1, 1: 2, 2: 3, 3: 1, 4: 1, 5: 2, 6: 3, 7: 1}, 
'purchases': {0: 1, 1: 2, 2: 3, 3: 1, 4: 1, 5: 2, 6: 3, 7: 1}, 
'sales': {0: 10, 1: 20, 2: 30, 3: 40, 4: 10, 5: 20, 6: 30, 7: 40}}) 

解決方案

#First group by entrydate and id, summing sales and take the max from purchases(removing duplicates). Then another group by to sum sales and purchases. 
df.groupby(['entrydate','id']).agg({'sales':sum, 'purchases':max}).groupby(level=0).sum().reset_index() 
Out[431]: 
    entrydate purchases sales 
0 05/03/2017   6 100 
1 06/03/2017   6 100