我是初学者学习Python。我有一个非常大的数据集 - 我无法优化我的代码以使其运行更快。
我的目标是优化所有这些(我当前的代码工作但速度慢):
减去两个日期列
使用该减法的结果创建新列
删除原始的两列
快速完成所有这些工作
随机发现: 考虑改变初始文件读取方法...... 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
任何优化技巧都会非常感激......
答案 0 :(得分:1)
您可以尝试使用sub
进行减法,并使用条件loc
和mask
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