设置
df = pd.DataFrame(dict(
A='XX YY ZZ AA'.split(),
Date=pd.date_range('2017-03-31', periods=4)
))
选项 1
apply 与基于 format 的 lambda 和字典解包。
这是一种缓慢但很酷的方法。
df.assign(C=df.apply(lambda x: '{Date:%Y-%m-%d}_{A}'.format(**x), 1))
A Date C
0 XX 2017-03-31 2017-03-31_XX
1 YY 2017-04-01 2017-04-01_YY
2 ZZ 2017-04-02 2017-04-02_ZZ
3 AA 2017-04-03 2017-04-03_AA
选项 2
numpy.core.defchararray.add
使用'datetime64[D]' 来四舍五入的非常快的方法。
chr_add = np.core.defchararray.add
d = df.Date.values.astype('datetime64[D]').astype(str)
a = df.A.values.astype(str)
df.assign(C=chr_add(chr_add(d, '_'), a))
A Date C
0 XX 2017-03-31 2017-03-31_XX
1 YY 2017-04-01 2017-04-01_YY
2 ZZ 2017-04-02 2017-04-02_ZZ
3 AA 2017-04-03 2017-04-03_AA
选项 3
扯掉@AndyHayden 的答案,稍作改动。我将在strftime 中添加下划线'_'... 主要是我将在timeit 中使用的内容。
df.assign(C=df.Date.dt.strftime('%Y-%m-%d_') + df.A)
A Date C
0 XX 2017-03-31 2017-03-31_XX
1 YY 2017-04-01 2017-04-01_YY
2 ZZ 2017-04-02 2017-04-02_ZZ
3 AA 2017-04-03 2017-04-03_AA
时机
%%timeit
chr_add = np.core.defchararray.add
d = df.Date.values.astype('datetime64[D]').astype(str)
a = df.A.values.astype(str)
chr_add(chr_add(d, '_'), a)
%timeit df.assign(C=df.apply(lambda x: '{Date:%Y-%m-%d}_{A}'.format(**x), 1))
%timeit df.assign(C=df.Date.dt.strftime('%Y-%m-%d_') + df.A)
小数据
10000 loops, best of 3: 53.2 µs per loop
1000 loops, best of 3: 1.14 ms per loop
1000 loops, best of 3: 831 µs per loop
大数据
df = pd.concat([df] * 10000, ignore_index=True)
10 loops, best of 3: 80.3 ms per loop
1 loop, best of 3: 4.58 s per loop
1 loop, best of 3: 233 ms per loop