首页 > 解决方案 > 编写函数以创建新的 pandas 列时出错

问题描述

我有一个数据框

 id |start|stop|join_date
 233| 0   | 12 |2015-01-01
 234| 0   | 12 |2013-03-04
 235| 10  | 23 |2014-01-10

目标:

我想创建另一列,根据日期是否为 0stop_date来偏移。join_datestart

如果start是 0 那么 stop_datejoin_date被月份抵消stop

如果start不是 0,那么 stop_date是被 in的月份和 in 的join_date月份所抵消stopstart

我写了以下函数:

def stop_date(x):
    if x['start'] == 0:
        return x['join_date'] + x['stop'].astype('timedelta64[M]')
    elif x['start'] != 0 :
        return x['join_date'] + x['start'].astype('timedelta64[M]') + x['stop'].astype('timedelta64[M]')
    else:
        return x

我试图通过以下方式应用于数据框:

df['stop_date'] = df.apply(stop_date, axis = 1)

我不断收到错误消息:AttributeError: ("'int' object has no attribute 'astype'", 'occured at index 0') 我不知道如何实现这一点。

标签: pythonpandas

解决方案


因为当 start 为 0 时,将 start 和 stop 相加不会改变要添加的月份数,您可以sum同时转换astype并添加“join_date”:

df['stop_date'] = (pd.to_datetime(df['join_date']) 
                   + df[['start', 'stop']].sum(axis=1).astype('timedelta64[M]')
                  ).dt.date

print (df)
    id  start  stop   join_date   stop_date
0  233      0    12  2015-01-01  2016-01-01
1  234      0    12  2013-03-04  2014-03-04
2  235     10    23  2014-01-10  2016-10-10

推荐阅读