首页 > 解决方案 > 是否有解决方案来计算和重新计算熊猫的条件?

问题描述

我想知道一辆车在一天内进行了多少次骑行,并为每一次写在新行中的骑行提供一个“骑行计数器”,指示当天的乘车顺序。我创建了一个列,指示骑行是否是一天中的第一天(“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

提前致谢!

标签: pythonpandasdataframe

解决方案


我们可以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)
)

推荐阅读