2017-09-15 74 views
0

我有以下數據框:GROUPBY的基礎上,另一列則設置列值(太多索引)

updated_at type  source 
0 2017-01-01 User  
1 2017-01-01 Inbound 
2 2017-01-02 User 
3 2017-01-02 Outbound 
4 2017-01-03 Outbound 
5 2017-01-03 User 

我需要擺脫行,其中type != User的,但接盤源的行其中type == User到我擺脫的行的type。到目前爲止,我試過做一個groupby('updated_at),但我遇到了在副本上設置值的錯誤。另外,groupby('updated_at')總是隻返回兩行。

這就是我想要的結果是:

updated_at type  source 
0 2017-01-01 User  Inbound 
2 2017-01-02 User  Outbound 
5 2017-01-03 User  Outbound 

注:我有〜37萬行

回答

0

如果你確信你的目標線是連續的,你可以使用shift

df["source"]=df["type"].shift(-1) 

,然後過濾掉線,其中type=="User"


EDIT

由於線不連續,不象在樣品中,

df=df.sort_values(["updated_at", "type"]) 

這將保證對一個時間戳類型總是(1)進/出(2)用戶。 然後:

df["source"]=df["type"].shift() 

,然後過濾掉線,其中type=="User"

+0

謝謝,我得到了它的工作。它們並不總是連續的,但增加'sort_values'就能做到。我的df實際上說比較複雜一些,但最終結果是: 'df [「source」] = df.sort_values('type')。groupby(['updated_at','operator_name'])[''鍵入']。shift(+1)' –

+0

看起來像'sort_values'沒有按計劃工作。仍然無法使'type'連續。 我想另一個選擇可能是使用'.groupby(...)。agg('sum')',但我不知道在sum函數中使用分隔符。 –

+0

你應該更具體地表達你的意思,「然後將type == User的行的源設置爲我擺脫的行的類型」。由於線條不連續,因此您應該保留一行中的「來源」?你擺脫了最後一行的字段「類型」?別的東西 – Phik

0

分割數據幀,並使用相同的索引規範它們。 然後宣佈來源列

user = df.loc[df.type == 'User',:] 
user.set_index('updated_at') 
bound = df.loc[df.type != 'User',:] 
bound.set_index('updated_at') 
user['source'] = bound.type