我有一个名为df
的数据帧,看起来与此类似(除了'Date'列的数量增加到Date_8
并且有几百个客户机-我在这里简化了它)
Client_ID Date_1 Date_2 Date_3 Date_4
C1019876 relationship no change no change no change
C1018765 no change single no change no change
C1017654 single no change relationship NaN
C1016543 NaN relationship no change single
C1015432 NaN no change single NaN
我想创建两个新列,first_status
和last_status
first_status
应等于4个日期列中的第一个给定关系状态,即relationship
或single
的第一个响应,而last_status
应等于4个日期列中的最后一个给定关系状态。结果df
应该是这样的
Client_ID Date_1 Date_2 Date_3 Date_4 first_status last_status
C1019876 relationship no change no change no change relationship relationship
C1018765 no change single no change no change single single
C1017654 single no change relationship NaN single relationship
C1016543 NaN relationship no change single relationship single
C1015432 NaN no change single NaN single single
我认为这两列可以通过列表理解来创建,但我不知道如何创建。对于first_status
列,我认为代码会对df
中的每一行执行如下操作:
Date
列(过滤掉NaN)no change
,则转到下一个Date
列relationship
,first_status
=relationship
single
,first_status
=single
对于last_status
列,我认为代码将在df
中的每一行上执行如下操作:
Date
列(过滤掉NaN)no change
,则转到上一列Date
relationship
,last_status
=relationship
single
,last_status
=single
我想如果你真的想使用列表理解,你可以,但是@yatu的解决方案会更快:
时间结果:
8 ms ± 230 µs per loop (mean ± std. dev. of 3 runs, 1000 loops each)
可以将^{}
no change
与np.nan
一起使用,并分别使用bfill
和ffill
选择第一个和最后一个有效值:如果有
Date
列到n
,请使用df.loc[:,:'Date_n'].ffill(axis=1).Date_n
作为last_status
相关问题 更多 >
编程相关推荐