首页 > 解决方案 > 根据另一列的进度值创建数据框列?

问题描述

我有以下数据框:

     car_id  time(seconds)   is_charging  
1      1         65              1
2      1         70              1
3      1         67              1
4      1         71              1
5      1         120             0
6      1         124             0 
7      1         117             0
8      1         80              1
9      1         74              1
10     1         62              1
11     1         130             0
12     1         124             0

我想创建新列来枚举“is_charging”列的充电和放电周期,以便稍后我可以按该新列分组并计算每个周期的平均值、最大值、最小值等。

生成的数据框应该是这样的:

     car_id  time(seconds)   is_charging  periods_id
1      1         65              1            1
2      1         70              1            1
3      1         67              1            1
4      1         71              1            1
5      1         120             0            2
6      1         124             0            2
7      1         117             0            2
8      1         80              1            3
9      1         74              1            3
10     1         62              1            3
11     1         130             0            4
12     1         124             0            4

我已经使用 for 语句完成了此操作,如下所示:

df['periods_ids] = 0

period_id = 1
previous_charging_state = df.at[0,'is_charging']

def computePeriodIDs():
    for ind in df.index:
        if df.at[index, 'is_charging'] != previous_charging_state:
            previous_charging_state  = df.at[index, 'is_charging']
            period_id  = period_id + 1
            df.at[index, 'periods_id'] = period_id
        else:
            df.at[index, 'periods_id'] = period_id

这对于我拥有的行数来说太慢了。我正在尝试使用矢量化函数,尤其是 apply() 函数,但由于我缺乏理解,我没有取得太大的成功,而且我在网上找不到类似的问题。

有人可以帮我优化这个问题吗?

标签: python-3.xpandas

解决方案


尝试这个:

df.is_charging.diff().ne(0).cumsum()

Out[115]:
1     1
2     1
3     1
4     1
5     2
6     2
7     2
8     3
9     3
10    3
11    4
12    4
Name: is_charging, dtype: int32

推荐阅读