python - 是否有解决方案来计算和重新计算熊猫的条件?
问题描述
我想知道一辆车在一天内进行了多少次骑行,并为每一次写在新行中的骑行提供一个“骑行计数器”,指示当天的乘车顺序。我创建了一个列,指示骑行是否是一天中的第一天(“Is_first_ride”)。如果是这样,我要创建的名为“#_of_ride”的新列应该从 1 开始计数,如果它是当天的第一次骑行,直到到达当天的下一次第一次骑行。我已经尝试了以下方法:
def counter(first_ride):
counter = 1
while first_ride != 1:
counter += 1
return counter
return 1
df["#_of_ride"] = df.apply (lambda x: counter(x[df["Is_first_ride"]]), axis=1)
但这会返回一个值错误 - 系列是模棱两可的。
最后,我希望创建如下所示的内容:
车 | 日期 | Is_first_ride | #_of_ride |
---|---|---|---|
福特 | 20.1.2021 | 1 | 1 |
福特 | 20.1.2021 | 0 | 2 |
福特 | 20.1.2021 | 0 | 3 |
福特 | 20.1.2021 | 0 | 4 |
菲亚特 | 20.1.2021 | 1 | 1 |
菲亚特 | 20.1.2021 | 0 | 2 |
菲亚特 | 20.1.2021 | 0 | 3 |
菲亚特 | 20.1.2021 | 0 | 4 |
福特 | 21.1.2021 | 1 | 1 |
福特 | 21.1.2021 | 0 | 2 |
提前致谢!
解决方案
我们可以cumsum
与布尔数组结合使用。我们使用布尔数组来制作游乐设施组,以及游乐设施计数器。
fr = df['Is_first_ride'].eq(1)
df['nr_of_ride'] = df['Is_first_ride'].ne(1).groupby(fr.cumsum()).cumsum().add(1)
car date Is_first_ride nr_of_ride
0 Ford 20.1.2021 1 1
1 Ford 20.1.2021 0 2
2 Ford 20.1.2021 0 3
3 Ford 20.1.2021 0 4
4 Fiat 20.1.2021 1 1
5 Fiat 20.1.2021 0 2
6 Fiat 20.1.2021 0 3
7 Fiat 20.1.2021 0 4
8 Ford 21.1.2021 1 1
9 Ford 21.1.2021 0 2
或者我们利用的第二个选项cumcount
(感谢 Shubham)和Is_first_ride
已经适合做 cumsum 的事实(所以我们跳过fr = ...
)
df['nr_of_ride'] = (
df['Is_first_ride'].ne(1)
.groupby(df['Is_first_ride'].cumsum())
.cumcount().add(1)
)
推荐阅读
- python - Python TypeError:“字节”类型的对象不是 JSON 可序列化的
- mysql - 数据库模式嵌套任务列表
- python-3.x - SQLite,Python:我的更新函数交换了一些列
- homebrew - 输入“brew医生”后收到错误
- django - 我无法在 pythonanywhere 的 bash 控制台中为 django webapp 运行蝗虫
- node.js - 带重定向的 Spawn 命令
- c++ - 在 poco 1.10.1 中发送 HTTPRequest 超时
- javascript - Mongoose 中的控制台输出承诺不起作用
- javascript - 如何在打字稿中获取对象值作为类型?
- java - 如何使一个类在java的构造函数中接受不同类型的子类(另一个父类)