d = {'country': ['US', 'US', 'US','US', 'US', 'US', 'UK', 'UK','UK','UK','UK'],
'status': [0, 0, 0, 0, 1,1,0, 0, 0, 1,1],
'count':[0, 1, 10, 20,30,40,0,1,2,4,6],
'date':['2020-04-05', '2020-04-06', '2020-04-07', '2020-04-11', '2020-04-12',
'2020-04-13', '2020-04-02', '2020-04-03', '2020-04-05', '2020-04-06', '2020-04-07']}
df = pd.DataFrame(data=d)
我首先想到的是用
df['day_diff']=df.groupby(['country', 'status'])['date'].apply(lambda x: x - x.min())
但是,美国状态0的0天应该出现在2020-04-06,而不是2020-04-05,其中计数为0(对不起,我不知道如何在这里正确输出)。所以,应用于返回的day_diff的组应该有两个条件。
日期 - date.min()
country status count date day_diff
US 0 0 2020-04-05 0 days
US 0 1 2020-04-06 1 days
US 0 10 2020-04-07 2 days
3 美国 0 20 2020-04-11 6天4 美国 1 30 2020-04-12 0天5 美国 1 40 2020-04-13 1天6 英国 0 0 2020-04-02 0天7 英国 0 1 2020-04-03 1天8 英国 0 2 2020-04-05 3天9 英国 1 4 2020-04-06 0天10 英国 1 6 2020-04-07 1天。
我希望得到一个类似于这样的结果(当然不行)。
df.groupby(['country', 'status'])['date'].apply(lambda x: x - x.min() if df['count']>0)
计算该日期与该组中最早的日期之间的差额 取决于第一个日期的计数是否超过0.
先谢谢你。
你可以使用 groupby().transform()
来提取最小日期。
min_dates = (df.date.mask(df['count'].eq(0))
.groupby([df['country'],df['status']])
.transform('min')
)
df['date_diff'] = df['date'] - min_dates
输出:
country status count date date_diff
0 US 0 0 2020-04-05 -1 days
1 US 0 1 2020-04-06 0 days
2 US 0 10 2020-04-07 1 days
3 US 0 20 2020-04-11 5 days
4 US 1 30 2020-04-12 0 days
5 US 1 40 2020-04-13 1 days
6 UK 0 0 2020-04-02 -1 days
7 UK 0 1 2020-04-03 0 days
8 UK 0 2 2020-04-05 2 days
9 UK 1 4 2020-04-06 0 days
10 UK 1 6 2020-04-07 1 days