这是我的数据框。
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来获取数据,但是不走运。 有没有更好的方法来实现这一目标? 谢谢。
答案 0 :(得分:1)
效率不高,但可以groupby
sorted
来isnull
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')