我有一个大型数据文件,如下所示:
vehicle id delta
0 0 0
1 0 20
2 0 40
3 0 400
4 0 10
5 1 0
6 1 10
7 1 500
8 1 10
9 1 10
10 1 100
11 1 10我想为以trip_1开头的每一种不同的车辆添加一个新的“trip”列,如果增量大于50,那么它将向旅行号添加一个数字,因此结果如下:
vehicle id delta Trip
0 0 0 trip_1
1 0 20 trip_1
2 0 40 trip_1
3 0 400 trip_2
4 0 10 trip_2
5 1 0 trip_1
6 1 10 trip_1
7 1 500 trip_2
8 1 10 trip_2
9 1 10 trip_2
10 1 100 trip_3
11 1 10 trip_3我正在考虑使用iterrow(),但是我想避免它,因为dataframe是巨大的。有什么建议吗?
发布于 2022-09-08 18:45:57
试试这个:
df['Trip'] = 'trip_' + df.groupby('id')['delta'].transform(
lambda grp: np.where(grp > 50, 1, 0).cumsum()+1).apply(str)
print(df) vehicle id delta Trip
0 0 0 0 trip_1
1 1 0 20 trip_1
2 2 0 40 trip_1
3 3 0 400 trip_2
4 4 0 10 trip_2
5 5 1 0 trip_1
6 6 1 10 trip_1
7 7 1 500 trip_2
8 8 1 10 trip_2
9 9 1 10 trip_2
10 10 1 100 trip_3
11 11 1 10 trip_3发布于 2022-09-08 18:29:18
试着做这样的事情:
df['trip'] = 'Trip_' + df.assign(tripid = (df.groupby('id')['delta'].diff() > 50).cumsum() + 1)\
.groupby('id')['tripid'].transform(lambda x: x.factorize()[0] + 1).astype(str)输出:
vehicle id delta trip
0 0 0 0 Trip_1
1 1 0 20 Trip_1
2 2 0 40 Trip_1
3 3 0 400 Trip_2
4 4 0 10 Trip_2
5 5 1 0 Trip_1
6 6 1 10 Trip_1
7 7 1 500 Trip_2
8 8 1 10 Trip_2
9 9 1 10 Trip_2
10 10 1 100 Trip_3
11 11 1 10 Trip_3发布于 2022-09-08 18:30:06
您可以使用np.select,它比循环要快得多
你的例子:
import numpy as np
delta = df["delta"]
condlist = [delta < 50, (delta >50) & (delta <100) , delta >=100]
choicelist = ["trip_1", "trip_2","trip_3"]
df["Trip"] = np.select(condlist, choicelist)输出
print(df)
vehicle id delta Trip
0 0 0 trip_1
1 0 20 trip_1
2 0 40 trip_1
3 0 400 trip_2
4 0 10 trip_2
5 1 0 trip_1
6 1 10 trip_1
7 1 500 trip_2
8 1 10 trip_2
9 1 10 trip_2
10 1 100 trip_3
11 1 10 trip_3https://stackoverflow.com/questions/73653435
复制相似问题