首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代和应用条件思想数据的快速方法

迭代和应用条件思想数据的快速方法
EN

Stack Overflow用户
提问于 2022-09-08 18:11:46
回答 4查看 41关注 0票数 1

我有一个大型数据文件,如下所示:

代码语言:javascript
复制
     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,那么它将向旅行号添加一个数字,因此结果如下:

代码语言:javascript
复制
      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是巨大的。有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-09-08 18:45:57

试试这个:

代码语言:javascript
复制
df['Trip'] = 'trip_' + df.groupby('id')['delta'].transform(
    lambda grp: np.where(grp > 50, 1, 0).cumsum()+1).apply(str)
print(df)

代码语言:javascript
复制
    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
票数 0
EN

Stack Overflow用户

发布于 2022-09-08 18:29:18

试着做这样的事情:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
    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
票数 1
EN

Stack Overflow用户

发布于 2022-09-08 18:30:06

您可以使用np.select,它比循环要快得多

你的例子:

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
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_3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73653435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档