python-3.x - 根据另一列的进度值创建数据框列?
问题描述
我有以下数据框:
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() 函数,但由于我缺乏理解,我没有取得太大的成功,而且我在网上找不到类似的问题。
有人可以帮我优化这个问题吗?
解决方案
尝试这个:
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
推荐阅读
- java - Raspan:从 Java/Tomcat 执行 Python 脚本,tomcat8 用户不接受
- swift - RLMException', reason: '试图在写事务之外修改对象
- angular - Angular Universal:我需要在服务器上安装 npm 包吗?
- node.js - Angular 5 - 使用 websockets 时检测变化
- ruby-on-rails - has_many 通过查询未返回预期结果
- ruby-on-rails - 打印字符串中给定的字符次数
- javascript - 根据特定属性过滤对象数组
- c - 对已经为 NULL 的指针使用 free() 是否有意义?
- php - 在 Laravel 中上传多个文件
- sql-server - 如何在字符串中找到N的第二个位置