我需要使用.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'))
答案 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。