如何重新采样/重组数据框

时间:2019-03-26 15:07:52

标签: python pandas

这是我的数据框。

 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   

我们的服务器会在用户成为绑定成员时捕获日期,并在用户以unbindate身份存在时捕获日期。如果是成员,则状态为= 1,否则为状态= 0

我想混搭记录以创建日期范围以将用户显示为成员。注意,用户A绑定和取消绑定两次,因此A最终不是成员。用户B绑定两次,解除绑定一次,因此B最终是成员,因此我将unbindate保留为None。 我试图使用.loc来获取数据,但是不走运。 有没有更好的方法来实现这一目标? 谢谢。

2 个答案:

答案 0 :(得分:1)

效率不高,但可以groupby sortedisnull

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

答案 1 :(得分:0)

如果您的数据帧与交错绑定和取消绑定所显示的完全一样,则aquariumImages.Children.Add(new DrawingGroup() { Children = { fishImage }, Transform = new RotateTransform(45)}); 就足够了:

shift

它给出了预期的结果:

df1['unbindate'] = df1.unbindate.shift(-1)
df1 = df1.loc[df1.status != 0].reset_index(drop=True).drop(columns='status')