簡體   English   中英

如何重新采樣/重組數據框

[英]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.

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