我正在尝试一个非常简单的事情 - 计算两列之间的月份,并将其保存到新列
df['AGE'] = (df.apply(lambda x: (x['DAX'].year - int(x['BIRTH_DATE'][:4])) * 12 +
x['DAX'].month - int(x['BIRTH_DATE'][5:7])
if x['BIRTH_DATE'] is not None
and int(x['BIRTH_DATE'][:4]) > 1900
else -1 # data quality
, axis=1).astype(np.int8))
我在加载一个非常大的2Gb csv文件时这样做。 DAX直接在阅读器中解析,而BIRTH_DATE保留为字符串。
这个简单的计算将加载时间增加了x10倍。有没有更智能的方法来计算大数据框架上的月龄?
以下是数据样本:
DAX BIRTH_DATE
2015-01-01 1931-12-03
2015-01-01 1991-04-19
2015-01-01 1992-10-11
2015-01-01 1982-05-20
2015-01-01 1987-12-20
2015-01-01 1976-07-30
2015-01-01 1951-05-11
2015-01-01 1993-05-06
2015-01-01 1989-02-27
我正在努力争取另一个专栏' AGE'自生日以来的几个月。
答案 0 :(得分:0)
由于您没有提供任何样本数据,我不能完全确定您的数据格式是什么。这样的东西应该可以使用,并且比使用apply()
快得多:
df['AGE'] = (df.DAX - df.BIRTH_DATE.astype('datetime64[ns]')).dt.days / 30
再次没有数据我不确定你的数据质量步骤需要做什么,但它可能会在上面的行之后修复如下:
df.loc[df['AGE'].isnull(), 'AGE'] = -1
答案 1 :(得分:0)
首先将BIRTH_DATE
转换为datetime
dtype:
In [257]: df['BIRTH_DATE'] = pd.to_datetime(df['BIRTH_DATE'], errors='coerce')
检查:
In [258]: df.dtypes
Out[258]:
DAX datetime64[ns]
BIRTH_DATE datetime64[ns]
dtype: object
现在我们可以做这个简单的数学运算:
In [259]: df['AGE'] = df.DAX.dt.year*12 + df.DAX.dt.month - \
(df.BIRTH_DATE.dt.year*12 + df.BIRTH_DATE.dt.month)
In [260]: df
Out[260]:
DAX BIRTH_DATE AGE
0 2015-01-01 1931-12-03 997
1 2015-01-01 1991-04-19 285
2 2015-01-01 1992-10-11 267
3 2015-01-01 1982-05-20 392
4 2015-01-01 1987-12-20 325
5 2015-01-01 1976-07-30 462
6 2015-01-01 1951-05-11 764
7 2015-01-01 1993-05-06 260
8 2015-01-01 1989-02-27 311