我在pandas方面遇到了问题,具体是如何按条件分组多列值:
以下是我的数据样式,作为pandas数据帧呈现:
id trigger timestamp
1 started 2017-10-01 14:00:1
1 ended 2017-10-04 12:00:1
2 started 2017-10-02 10:00:1
1 started 2017-10-03 11:00:1
2 ended 2017-10-04 12:00:1
2 started 2017-10-05 15:00:1
1 ended 2017-10-05 16:00:1
2 ended 2017-10-05 17:00:1
我的目标是找到按id分组后的日期之间的天数、小时数或分钟数的差异。
我的输出应该更像这样(以小时为单位):
id trigger timestamp trigger timestamp diff
1 started 2017-10-01 14:00:1 ended 2017-10-04 12:00:1 70
1 started 2017-10-03 11:00:1 ended 2017-10-05 16:00:1 53
2 started 2017-10-02 10:00:1 ended 2017-10-04 12:00:1 26
2 started 2017-10-05 15:00:1 ended 2017-10-05 17:00:1 2
我尝试了很多选项,但是我找不到最有效的解决方案。
以下是我目前的代码:
首先,我尝试将数据分为“开始”和“结束”:
df['started'] = df.groupby(['id', 'timestamp'])['trigger'] == 'started'
df['ended'] = df.groupby(['id', 'timestamp'])['trigger'] == 'ended'
并且:
df.groupby(['id', 'started', 'ended'], as_index=True).sum()
但它并没有起作用。
df['started'] = df.groupby(['trigger'])['timestamp'].np.where(df['trigger']=='started')
没有良好的结果。
有人能指点一下如何使用pandas来做到这一点吗?
我的数据中还会有空值匹配,我该如何使用df.fillna(method='ffill')
将NaN或缺失数据添加到新的数据框中。
df.iterrows()
或者更快的df.itertuples()
来解决这个问题。至于.fillna
,问题不是很清楚,但是你发布的代码将会向前填充值,你可以像这样做df['column_name'].fillna(value=0)
来替换名为column_name
的特定列中的NaN
为0
。 - joaoavf