2017-05-05 75 views
3

我有一个熊猫数据框4列包含一些零诠释值和一些日期时间。我想创建一个真/假值的新柱告诉我,如果日期时间是按时间顺序排列,即使有些是0如何检查日期时间是否与数据框中缺少日期时间一致?

例如DF

P1. P2. P3. P4. 
0. 2011. 0. 2015 
2015. 0. 0. 2013 

然后我想使一个新的只有T/F取决于它是否按照时间顺序排列的列在上面第1行的情况下为真,第2行为假。

我已经考虑与if和else循环,但想知道是否有一个更清洁的方式。 FYI日期格式为2014-11-31 00:00:00。

在此先感谢。

回答

2

来源DF:

In [250]: x 
Out[250]: 
     P1.  P2. P3. P4. 
0  0.0 2011.0 0.0 2015 
1 2015.0  0.0 0.0 2013 

解决方案:

In [251]: x['new'] = x[x!=0].apply(lambda x: x.dropna().is_monotonic, axis=1) 

结果:

In [252]: x 
Out[252]: 
     P1.  P2. P3. P4. new 
0  0.0 2011.0 0.0 2015 True 
1 2015.0  0.0 0.0 2013 False 
2

这里是逻辑以下的方法:

  • 使用apply通过行的方法来循环轴线= 1;
  • 对于每一行,删除零,计算差异并与零进行比较;
  • 如果没有任何差异小于零,那么您可以声称它是按照时间顺序(升序);

此外,如果该行包含零或一个有效日期(不为零),这种逻辑给出正确的:

df.apply(lambda r: ~(r[r != 0].diff() < 0).any(), 1) 

#0  True 
#1 False 
#dtype: bool 
+0

看起来像一个很好的答案,但是这是真的密集...你可以解包一点点?也许有些意见? –

+1

@JLong添加评论。 – Psidom

相关问题