Python 在尝试删除重复项时,熊猫只删除某些列值

Python 在尝试删除重复项时,熊猫只删除某些列值,python,pandas,dataframe,Python,Pandas,Dataframe,我的问题有点类似,但不完全相同。我有一个具有以下结构的CSV | 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 |

我的问题有点类似,但不完全相同。我有一个具有以下结构的CSV

| 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         |
我把它读入一个数据框架,我想得到每日的销售和购买总量(个人id不重要,只是每日总量)

但是,首先,我需要删除重复项。这让我大吃一惊,因为如果你以上面的例子为例,对于id 1,同一天有两个条目,但是
购买
列中的多个条目被认为是重复的,而
销售
列中的多个条目是有效的,因此正确的分组将导致

| 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         |
我试图使用删除
购买的
副本

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')

但是,虽然这将删除重复的
购买
,但它也会删除有效的
销售


A-Za-z解决方案的图像


如果按entrydate分组,则可以汇总销售和购买:

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

您可以使用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
设置

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

对不起,也许我需要整理一下我的问题。我想对销售额求和,但对于购买,我首先要删除每个id的重复条目,然后求和。因此,销售总额确实将总计为100,但购买量将为6(因为每个id统计每个日期只有一个条目)@PhilipO'Brien为什么要选择40而不是30?或者两者都取?它应该从sales列中取(总和),但从purchases列中只取一个(Burchases中的每日条目总是相同的,所以不管取哪一个),这几乎对我有效,除非csv中存在另一个日期,假设我在csv中有一行,如
1,06/03/2017,40,1
,它似乎将该id的所有日期的销售额相加,并将该值用于所有日期。请参见问题中的更新屏幕截图
#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