我试图计算pandas数据帧中两个连续行之间的差异,并根据我想要填充一些值的列的结果。
例如:
以下是示例数据
ID Date
1 2/2/2018
2 2/3/2018
3 2/18/2018
3 2/19/2018
3 2/27/2018
4 5/5/2018
4 6/9/2018
5 6/10/2018
6 7/1/2018
6 7/2/2018
6 7/10/2018
6 7/30/2018
6 8/1/2018
6 8/3/2018
7 8/10/2018
数据按ID分组。
以下是示例输出数据
因此,每当ID更改时,“Code”列都有“I”。对于相同的ID,如果两个连续日期之间的差异小于30,则“Code”列具有“R1”,如果下一个日期在前一个日期的30天内,则相同的ID“Code”将具有“R2”并且如果下一个数据在前一个“代码”的30天内具有相同的ID将具有“R4”。例如,使用案例ID - “4”,“Code”的行都是“I”,因为即使ID = 4,这两个日期相隔30天以上。 6/9/2018 - 5/5/2018 = 34。
sorted_data["Code"] = "I"
def conditions(data):
if data['Completed Date'].diff() <=30:
val = "R1"
elif data['Completed Date'].diff() <=30:
val = "R2"
elif data['Completed Date'].diff() <=30:
val = "R3"
elif data['Completed Date'].diff() <=30:
val = "R4"
elif data['Completed Date'].diff() <=30:
val = "R5"
elif data['Completed Date'].diff() <=30:
val = "R6"
elif data['Completed Date'].diff() <=30:
val = "R7"
elif data['Completed Date'].diff() <=30:
val = "R8"
return val
for groups, data in sorted_data.groupby("Cust_No"):
print(conditions(sorted_data))
我不知道如何拿起下一行值来比较日期。上面的代码不起作用,给我错误。
可能不是最优的,但在途中将使用iterrows:
prev_id = 'x'
prev_date = pd.to_datetime('1/1/1900')
prev_rpt = 0
for idx,ser in df.iterrows():
if ser.ID == prev_id and (ser.Date - prev_date).days < 30:
prev_rpt += 1
df.loc[idx,'Code'] = 'R' + str(prev_rpt)
else:
df.loc[idx,'Code'] = 'I'
prev_rpt = 0
prev_id = ser.ID
prev_date = ser.Date
按ID
分组,查找与前一日期的日期差异小于或等于30的所有行。
然后再次由ID
分组,得到累积总和并设置I
,其中值等于0其他前缀与R
x = df.groupby('ID').apply(lambda x: x.Date-x.Date.shift() <= pd.Timedelta(days=30)).astype(int)
df['out'] = x.groupby('ID').cumsum().apply(lambda x: 'I' if x == 0 else f'R{x}').reset_index(drop=True)
# output:
ID Date out
0 1 2018-02-02 I
1 2 2018-02-03 I
2 3 2018-02-18 I
3 3 2018-02-19 R1
4 3 2018-02-27 R2
5 4 2018-05-05 I
6 4 2018-06-09 I
7 5 2018-06-10 I
8 6 2018-07-01 I
9 6 2018-07-02 R1
10 6 2018-07-10 R2
11 6 2018-07-30 R3
12 6 2018-08-01 R4
13 6 2018-08-03 R5
14 7 2018-08-10 I