优化大数据帧上的日期减法 - 熊猫

时间:2016-12-11 08:48:21

标签: python datetime pandas dataframe

我是初学者学习Python。我有一个非常大的数据集 - 我无法优化我的代码以使其运行更快。

我的目标是优化所有这些(我当前的代码工作但速度慢):

  1. 减去两个日期列

  2. 使用该减法的结果创建新列

  3. 删除原始的两列

  4. 快速完成所有这些工作

  5. 随机发现: 考虑改变初始文件读取方法...... https://softwarerecs.stackexchange.com/questions/7463/fastest-python-library-to-read-a-csv-file

    我在读取CSV文件时有parse_dates = True - 这可能是一个减速吗?我有50多列,但只有1个时间戳列和1年列。

    这一栏:

              saledate
    1          3/26/2004 0:00
    2          2/26/2004 0:00
    3          5/19/2011 0:00
    4          7/23/2009 0:00
    5         12/18/2008 0:00
    

    减去(这是否应转换为1/1/1996的格式?):

              YearMade
    1         1996
    2         2001
    3         2001
    4         2007
    5         2004
    

    当前代码:

    mean_YearMade = dfx[dfx['YearMade'] > 1000]['YearMade'].mean()
    
    def age_at_sale(df, mean_YearMade):
        '''
        INPUT: Dateframe
        OUTPUT: Dataframe
        Add a column called AgeSale
        '''
        df.loc[:, 'YearMade'][df['YearMade'] == 1000] = mean_YearMade
        # Column has tons of erroneous years with 1000
        df['saledate'] = pd.to_datetime(df['saledate'])
        df['saleyear'] = df['saledate'].dt.year
        df['Age_at_Sale'] = df['saleyear'] - df['YearMade']
        df = df.drop('saledate', axis=1)
        df = df.drop('YearMade', axis=1)
        df = df.drop('saleyear', axis=1)
        return df
    

    任何优化技巧都会非常感激......

1 个答案:

答案 0 :(得分:1)

您可以尝试使用sub进行减法,并使用条件locmask dfx['YearMade'] > 1000进行选择。另外,创建列saleyear也不是必需的。

dfx['saledate'] = pd.to_datetime(dfx['saledate'])
mean_YearMade = dfx.loc[dfx['YearMade'] > 1000, 'YearMade'].mean()

def age_at_sale(df, mean_YearMade):
    '''
    INPUT: Dateframe
    OUTPUT: Dataframe
    Add a column called AgeSale
    '''
    df.loc[df['YearMade'] == 1000, 'YearMade'] = mean_YearMade
    df['Age_at_Sale'] = df['saledate'].dt.year.sub(df['YearMade'])
    df = df.drop(['saledate', 'YearMade'], axis=1)
    return df