我有一个如下的数据框架:
df = pd.DataFrame( {'date': ['2019-12-22', '2019-12-22','2019-12-15','2019-12-15',
'2019-12-08', '2019-12-08','2019-12-01', '2019-12-01',
'2019-11-24', '2019-11-24','2019-11-17', '2019-11-17',
'2019-11-10', '2019-11-10'],
'name': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B']})我想要做的是从最近的日期开始,为每两个连续的日期分配一个标记(数字)。需要如下结果:
date name tag
0 2019-12-22 A 1
1 2019-12-22 B 1
2 2019-12-15 A 1
3 2019-12-15 B 1
4 2019-12-08 A 2
5 2019-12-08 B 2
6 2019-12-01 A 2
7 2019-12-01 B 2
8 2019-11-24 A 3
9 2019-11-24 B 3
10 2019-11-17 A 3
11 2019-11-17 B 3
12 2019-11-10 A 4
13 2019-11-10 B 4实现这一目标的最佳方法是什么?需要一般的解决方案,可以适用于n个连续的日期。
发布于 2020-02-11 14:02:08
使用cumsum和楼层分割:
df["tag"] = (df["date"].eq(df["date"].shift(-1)).cumsum()+1)//2
print (df)
date name tag
0 2019-12-22 A 1
1 2019-12-22 B 1
2 2019-12-15 A 1
3 2019-12-15 B 1
4 2019-12-08 A 2
5 2019-12-08 B 2
6 2019-12-01 A 2
7 2019-12-01 B 2
8 2019-11-24 A 3
9 2019-11-24 B 3
10 2019-11-17 A 3
11 2019-11-17 B 3
12 2019-11-10 A 4
13 2019-11-10 B 4发布于 2020-02-11 14:17:00
通过Series.diff和add Series.cumsum比较不相等的差异
df['tag'] = df['date'].diff().dt.days.ne(0).cumsum()
print (df)
date name tag
0 2019-12-22 A 1
1 2019-12-22 B 1
2 2019-12-15 A 2
3 2019-12-15 B 2
4 2019-12-08 A 3
5 2019-12-08 B 3
6 2019-12-01 A 4
7 2019-12-01 B 4
8 2019-11-24 A 5
9 2019-11-24 B 5
10 2019-11-17 A 6
11 2019-11-17 B 6
12 2019-11-10 A 7
13 2019-11-10 B 7如果连续的组没有重复,这意味着在样本数据中,2019-12-08被2019-12-22替换为使用整数除法的factorize:
df['tag'] = pd.factorize(df['date'])[0] + 2 // 2
print (df)
date name tag
0 2019-12-22 A 1
1 2019-12-22 B 1
2 2019-12-15 A 2
3 2019-12-15 B 2
4 2019-12-08 A 3
5 2019-12-08 B 3
6 2019-12-01 A 4
7 2019-12-01 B 4
8 2019-11-24 A 5
9 2019-11-24 B 5
10 2019-11-17 A 6
11 2019-11-17 B 6
12 2019-11-10 A 7
13 2019-11-10 B 7https://stackoverflow.com/questions/60162544
复制相似问题