簡體   English   中英

Pandas - 具有來自另一列的條件的groupby列

[英]Pandas - groupby columns with conditions from another column

我正在努力研究如何使用條件對多個列值進行分組:

以下是我的數據作為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分組的日期之間的日/小時或分鍾差異。

我的輸出看起來應該更像這樣(在hrs中的diff):

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')

也沒有直覺的結果。

有人指出如何用熊貓做正確的方向嗎? 我還將在數據中使用空匹配,如何使用df.fillna(method='ffill')將NaN或缺少的數據添加到新數據幀。

  1. idtrigger設置為索引
  2. 由於索引包含重復的條目,因此使用groupwise cumcount附加另一個索引列。 MultiIndexdf必須有一個包含3列的MultiIndex
  3. timestamp unstack
  4. 找到每小時列之間的差異並返回結果

df['timestamp'] = pd.to_datetime(df['timestamp']) # if necessary

i = df.groupby(['id', 'trigger']).cumcount()
df.set_index(['id', i, 'trigger']).timestamp.unstack().assign(
       diff=lambda d: d.ended.sub(d.started).dt.total_seconds() / 3600
)

感謝piRSquared的改進。

v

                  timestamp                      diff
trigger               ended             started      
id                                                   
1  0    2017-10-04 12:00:01 2017-10-01 14:00:01  70.0
   1    2017-10-05 16:00:01 2017-10-03 11:00:01  53.0
2  0    2017-10-04 12:00:01 2017-10-02 10:00:01  50.0
   1    2017-10-05 17:00:01 2017-10-05 15:00:01   2.0

結果與您的問題中描述的不完全相同,但我相信列的MultiIndex將是一種更清晰的方式來表示輸出而不是兩個觸發列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM