非常简单易懂,只有一行代码,看起来很像 Python 语言。
df['city'] + (df['city'] == 'paris')*('_' + df['arr'].astype(str))
s = """city,arr,final_target
paris,11,paris_11
paris,12,paris_12
dallas,22,dallas
miami,15,miami
paris,16,paris_16"""
import pandas as pd
import io
df = pd.read_csv(io.StringIO(s)).sample(1000000, replace=True)
df
速度
%%timeit
df['city'] + (df['city'] == 'paris')*('_' + df['arr'].astype(str))
%%timeit
df['final_target'] = np.where(df['city'].eq('paris'),
df['city'] + '_' + df['arr'].astype(str),
df['city'])
我不确定为什么这个例子失败了(更新:由于采样而失败),但内存错误仍然是一个谜题在使用pandas的.loc进行采样而不是直接计算时为什么会出现内存错误
%%timeit
df['final_target'] = df['city']
df.loc[df['city'] == 'paris', 'final_target'] += '_' + df['arr'].astype(str)
MemoryError: Unable to allocate 892. GiB for an array with shape (119671145392,) and data type int64