代码之家  ›  专栏  ›  技术社区  ›  daiyue

在GroupBy上使用Apply时,“dataframe”对象没有属性“dt”

  •  2
  • daiyue  · 技术社区  · 6 年前

    我有以下内容 df ,

    code    date1        date2
    2000    2018-03-21   2018-04-04
    2000    2018-03-22   2018-04-05
    2000    2018-03-23   2018-04-06
    

    当我尝试

    df_code_grp_by = df.groupby(['code'])
    
    df_code_grp_by.apply(lambda x: x.date2 - x.date1).dt.days.sum(level=0).reset_index(name='date_diff_sum')
    

    我得到了

    AttributeError: 'DataFrame' object has no attribute 'dt'
    

    date1 date2 都是 dtype('<M8[ns]') ,我想知道如何修复它。

    我正在使用 Pandas 0.22.0 , Python 3.5.2 Numpy 1.15.4 .

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    这里最好是创建索引 code 列和减法 Series :

    df = df.set_index('code')
    df = (df.date2 - df.date1).dt.days.sum(level=0).reset_index(name='date_diff_sum')
    print (df)
       code  date_diff_sum
    0  2000             42
    

    代码的问题是 apply 返回行(可能是bug):

    df_code_grp_by = df.groupby(['code'])
    
    df = df_code_grp_by.apply(lambda x: x.date2 - x.date1)
    print (df)
                         0                 1                 2
    code                                                      
    2000  1209600000000000  1209600000000000  1209600000000000
    

    可能的解决方案是使用 np.sum :

    df = (df_code_grp_by.apply(lambda x: np.sum(x.date2 - x.date1))
                        .dt.days
                        .reset_index(name='date_diff_sum'))
    print (df)
       code  date_diff_sum
    0  2000             42