python - 使用正则表达式有效地将一列中的部分值替换为 pandas 中另一列中的值?

标签 python pandas vectorization

我有一个 pandas 数据框 df,日期为字符串:

Date1        Date2
2017-08-31   1970-01-01 17:35:00
2017-10-31   1970-01-01 15:00:00
2017-11-30   1970-01-01 16:30:00
2017-10-31   1970-01-01 16:00:00
2017-10-31   1970-01-01 16:12:00

我想要做的是将 Date2 列中的每个日期部分替换为 Date1 中的相应日期,但保持时间不变,因此输出为:

Date1        Date2
2017-08-31   2017-08-31 17:35:00
2017-10-31   2017-10-31 15:00:00
2017-11-30   2017-11-30 16:30:00
2017-10-31   2017-10-31 16:00:00
2017-10-31   2017-10-31 16:12:00

我已经使用 pandas replace 和正则表达式实现了这一点

import re
date_reg = re.compile(r"([0-9]{4}\-[0-9]{2}\-[0-9]{2})")
df['Market Close Time'].replace(to_replace=date_reg, value=df['Date1'], inplace=True)

但对于只有 15 万行的数据帧,此方法非常慢(>10 分钟)。

解决方案来自 this post实现了更快的 numpy np.where - 我如何在这个例子中使用 np.where ,或者是否有另一种更有效的方法来执行此操作?

最佳答案

一个想法是:

df['Date3'] =  ['{} {}'.format(a, b.split()[1]) for a, b in zip(df['Date1'], df['Date2'])]

或者:

df['Date3'] = df['Date1'] + ' ' + df['Date2'].str.split().str[1]
print (df)
        Date1                Date2                Date3
0  2017-08-31  1970-01-01 17:35:00  2017-08-31 17:35:00
1  2017-10-31  1970-01-01 15:00:00  2017-10-31 15:00:00
2  2017-11-30  1970-01-01 16:30:00  2017-11-30 16:30:00
3  2017-10-31  1970-01-01 16:00:00  2017-10-31 16:00:00
4  2017-10-31  1970-01-01 16:12:00  2017-10-31 16:12:00

或者:

df['Date3'] = pd.to_datetime(df['Date1']) + pd.to_timedelta(df['Date2'].str.split().str[1])
print (df)
        Date1                Date2               Date3
0  2017-08-31  1970-01-01 17:35:00 2017-08-31 17:35:00
1  2017-10-31  1970-01-01 15:00:00 2017-10-31 15:00:00
2  2017-11-30  1970-01-01 16:30:00 2017-11-30 16:30:00
3  2017-10-31  1970-01-01 16:00:00 2017-10-31 16:00:00
4  2017-10-31  1970-01-01 16:12:00 2017-10-31 16:12:00

时间:

In [302]: %timeit df['Date3'] =  ['{} {}'.format(a, b.split()[1]) for a, b in zip(df['Date1'], df['Date2'])]
30.2 ms ± 137 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [303]: %timeit df['Date3'] = df['Date1'] + ' ' + df['Date2'].str.split().str[1]
66.4 ms ± 3.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 使用正则表达式有效地将一列中的部分值替换为 pandas 中另一列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583265/

相关文章:

python - 计算 .txt 文件中值的连续出现次数

python - 在 python 中将列表打印到表上

python - 如何以不同的增量减去 2 个单独文件的特定行

python - 如何使用 Pandas 提取两次之间的行?

c++ - 现代 C++ 编译器是否自动矢量化代码以进行 24 位图像处理?

python - 使用方法 ='linear' 和 'nearest' 的 Pandas.DataFrame interpolate() 返回尾随 NaN 的不一致结果

python - JSON 文件到数据帧转换-ValueError : Unexpected character found when decoding array value (2)

python - 如何迭代数据框列表并在未找到特定字符串时删除所有数据

python - 缩放/旋转成对平方欧氏距离的矢量化计算

matlab - 以一定的偏移量向左和向右扩展列向量以形成二维矩阵 - MATLAB