[英]How to resample/reorganize dataframe
這是我的數據框。
df1=pd.DataFrame({'user':['A','A','A','A','B','B','B'], 'status':
[1,0,1,0,1,0,1],'bindate':['2019-1-20','','2019-1-27','','2019-1-
2','','2019-1-25'],'unbindate':['','2019-1-25','','2019-1-30','','2019-
1-20','']})
看起來像這樣
user stutas bindate unbindate
0 A 1 2019-01-20 Nat
1 A 0 Nat 2019-01-25
2 A 1 2019-01-27 Nat
3 A 0 Nat 2019-01-30
4 B 1 2019-01-02 Nat
5 B 0 Nat 2019-01-20
6 B 1 2019-01-25 Nat
我想使用 Pandas 提出一個如下所示的新數據框
user bindate unbindate
0 A 2019-01-20 2019-01-25
1 A 2019-01-27 2019-01-30
2 B 2019-01-02 2019-01-20
3 B 2019-01-25 None
我們的服務器將用戶成為成員的日期捕獲為綁定,並將用戶存在成員的日期捕獲為取消綁定。 如果是會員,則status=1,否則status=0
我想混合記錄以創建日期范圍以將用戶顯示為成員。 注意用戶 A 綁定和解除綁定兩次,所以 A 最終不是成員。 用戶 B 綁定兩次,解除綁定一次,所以 B 是最后的成員,因此我將取消綁定保留為無。 我嘗試使用 .loc 來獲取數據,但沒有運氣。 有沒有更好的方法來實現這一目標? 謝謝你。
不退出高效但工作groupby
sorted
isnull
對值進行sorted
df=df.mask(df=='Nat')
df.groupby('user').apply(lambda x : x.apply(lambda y : sorted(y,key=pd.isnull))).\
dropna(subset=['bindate','unbindate'],thresh=1)
Out[64]:
user stutas bindate unbindate
0 A 1 2019-01-20 2019-01-25
1 A 0 2019-01-27 2019-01-30
4 B 1 2019-01-02 2019-01-20
5 B 0 2019-01-25 NaN
如果您的數據幀與您顯示的交錯綁定和解除綁定完全一樣,那么shift
就足夠了:
df1['unbindate'] = df1.unbindate.shift(-1)
df1 = df1.loc[df1.status != 0].reset_index(drop=True).drop(columns='status')
它按預期提供:
user bindate unbindate
0 A 2019-1-20 2019-1-25
1 A 2019-1-27 2019-1-30
2 B 2019-1-02 2019-1-20
3 B 2019-1-25 NaN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.