'if'在计算新列时的函数上

时间:2016-09-13 13:56:59

标签: python-3.x pandas

我有一个包含2列的pandas数据框dfdate1date2。我想用2之间的月距离计算一个新的。

如果我这样做:

def meses(d1, d2):
    return (d1.year - d2.year)*12 + d1.month - d2.month

df['mora']=meses(df.date1.dt,df.date2.dt)

工作正常,但如果我想减少一个月的情况,那么两个日期的天数差异为负数的情况如下:

def meses(d1, d2):
    if (d2.day-d1.day)<0:
        resto=1
    else:
        resto=0
    return (d1.year - d2.year)*12 + d1.month - d2.month - resto

df['mora']=meses(df.date1.dt,df.date2.dt)

给了我以下错误:

  

----&GT; 2 if(d2.day-d1.day)&lt; 0:

     

ValueError:系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

似乎问题在于函数中的if。我该如何解决?

我的数据框:

date1   date2
2013-08-27  2013-11-07
2013-10-01  2013-12-06
2013-11-01  2014-01-09
2013-11-29  2014-02-05
2013-12-27  2014-03-17
2014-01-31  2014-04-24

我想要一个新的列'mora'与其他2列的月份不同,第一个函数给了我:

df['mora']=meses(df.date2.dt,df.date1.dt)

    date1   date2   mora
2013-08-27  2013-11-07  3
2013-10-01  2013-12-06  2
2013-11-01  2014-01-09  2
2013-11-29  2014-02-05  3
2013-12-27  2014-03-17  3
2014-01-31  2014-04-24  3

但如果我使用.day版本,它会给我错误。

2 个答案:

答案 0 :(得分:1)

第一个可行,因为您一次对整个系列执行简单计算,即只减去或添加整个列。第二个不起作用,因为您检查整个序列/值列表是否小于另一个。显然,更有效的方法可以做到这一点,但我保持尽可能接近原始解决方案,请尝试这样做:

import numpy as np

df['mora']=np.where(df.date1.dt.day < df.date2.dt.day, \
         (df.date1.dt.year - df.date2.dt.year)*12 + df.date1.dt.month - df.date2.dt.month - 1, \
          (df.date1.dt.year - df.date2.dt.year)*12 + df.date1.dt.month - df.date2.dt.month)

答案 1 :(得分:0)

ValueError提供的消息很明确:

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

if子句获取系列d2.day-d1.day的真值,这是Series本身。 如果您希望all行为< 0,则应使用all关键字。

Related answer