Я бы хотел предложить другой вариант:
pdf['a'].str.cat([pdf['b'], pdf['c']], sep='_')
Вывод:
0 a_b_c
1 d_e_f
2 g_h_i
Name: a, dtype: object
Время
# Compose data
a = ['a','b','c']
b = ['d','e','f']
c = ['g','h','i']
pdf = pd.DataFrame([a,b,c], columns=['a','b','c'])
def met_add(d):
return df['a'] + '_' + df['b'] + '_' + df['c']
def met_agg_axis1(d):
return df[['a', 'b', 'c']].agg('_'.join, axis=1)
def met_str_cat(d):
return pdf['a'].str.cat([pdf['b'], pdf['c']], sep='_')
def met_map_join(d):
return pd.Series( [i for i in map(lambda x: '_'.join([x.a, x.b, x.c]), pdf.itertuples())])
def met_iter_join(d):
tmp=[]
for i in pdf.itertuples():
tmp.append('_'.join([i.a, i.b, i.c]))
return pd.Series(tmp)
def met_numpy_add(d):
return pd.Series(pdf['a'].to_numpy() + '_' + pdf['b'].to_numpy() + '_' + pdf['c'].to_numpy())
res = pd.DataFrame(
index=[10, 30, 100, 300,1000, 3000, 10000, 30000, 100000, 300000],
columns='met_add met_agg_axis1 met_str_cat met_map_join met_iter_join met_numpy_add'.split(),
dtype=float
)
for i in res.index:
d = pd.concat([pdf]*i).add_prefix('col')
for j in res.columns:
print(d.shape)
stmt = '{}(d)'.format(j)
setp = 'from __main__ import d, {}'.format(j)
res.at[i, j] = timeit(stmt, setp, number=100)
res.plot(loglog=True, figsize=(10,8));
Вывод диаграммы:
введите описание изображения здесь