按一列分组数据,并从另外两列中选择第一个出现的数据

时间:2015-12-21 21:35:21

标签: python pandas group-by

我需要使用.groupby() customer,然后为客户首次购买的日期添加一列,并为相应的购买金额添加另一列。

这是我的代码。我做的第一部分错了,不知道如何做第二部分。我试过.loc.idxmin ....

mydata = [{'amount': 3200, 'close_date':'2013-03-31', 'customer': 'Customer 1',},
          {'amount': 1430, 'close_date':'2013-11-30', 'customer': 'Customer 1',},
          {'amount': 4320, 'close_date':'2014-03-31', 'customer': 'Customer 2',},
          {'amount': 2340, 'close_date':'2015-05-18', 'customer': 'Customer 2',},
          {'amount': 4320, 'close_date':'2015-06-29', 'customer': 'Customer 2',},]

df = pd.DataFrame(mydata)
df.close_date = pd.to_datetime(df.close_date)
df['first_date'] = df.groupby('customer')['close_date'].min().apply(lambda x: x.strftime('%Y-%m'))

2 个答案:

答案 0 :(得分:3)

如果您按close_date对数据进行排序,则可以执行以下操作:

df.sort_values('close_date').groupby(['customer'])['close_date', 'amount'].first()

           close_date  amount
customer                     
Customer 1 2013-03-31    3200
Customer 2 2014-03-31    4320
.sort_values()已添加

0.17,过去为sort() (see docs)

答案 1 :(得分:0)

两个步骤。

首次购买当天:

In [34]: first = df.groupby('customer').close_date.min()

In [35]: first
Out[35]:
customer
Customer 1    2013-03-31
Customer 2    2014-03-31
Name: close_date, dtype: object

我们首先使用它作为索引器,

In [36]: idx = pd.MultiIndex.from_tuples(list(first.iteritems()), names=['customer', 'close_date'])

In [37]: idx
Out[37]:
MultiIndex(levels=[['Customer 1', 'Customer 2'], ['2013-03-31', '2014-03-31']],
           labels=[[0, 1], [0, 1]])

对于具有这两个级别的DataFrame

In [38]: df2 = df.set_index(['customer', 'close_date'])

In [39]: df2.loc[idx]
Out[39]:                       
                         amount
customer   close_date
Customer 1 2013-03-31    3200
Customer 2 2014-03-31    4320

这是一个系列,您可以使用.unstack()来获取DataFrame。