python - Pandas:如何在列表中每个项目的前面添加一个字符?
问题描述
我在 x 列中有一个带有不同行字符的 pandas 数据框,我想将这些字符添加到行对应列表中每个项目的前面。
这是我的熊猫df:
df_1 = pd.DataFrame({'x' : ['a', 'b', 'c'], 'y' : [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]})
x y
a [1,2,3,4]
b [5,6,7,8]
c [9,10,11,12]
这就是我希望预期输出的样子:
x y
a [a 1,a 2,a 3,a 4]
b [b 5,b 6,b 7,b 8]
c [c 9,c 10,c 11,c 12]
如何循环遍历数据框并将 x 列中的字符添加到 y 列相应列表中每个项目的前面?
谢谢!
解决方案
使用 s 的列表理解f-string
应该非常快:
df_1['y'] = [[f'{x} {i}' for i in y] for x, y in df_1[['x','y']].to_numpy()]
print (df_1)
x y
0 a [a 1, a 2, a 3, a 4]
1 b [b 5, b 6, b 7, b 8]
2 c [c 9, c 10, c 11, c 12]
30k 行的性能:
df_1 = pd.DataFrame({'x' : ['a', 'b', 'c'], 'y' : [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]]})
df_1 = pd.concat([df_1] * 10000, ignore_index=True)
%timeit df_1.explode('y').apply(lambda r: f"{r['x']} {r['y']}", axis=1).groupby(level=0).apply(list)
2.84 s ± 823 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df_1.apply(lambda x: [f"{x['x']} {i}" for i in x['y']], axis=1)
730 ms ± 5.46 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df_1.apply(lambda x: [*map(x[0].__add__(' ').__add__, map(str, x[1]))], axis=1)
376 ms ± 27.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit df_1.explode('y').assign(y=lambda d: d['x']+' '+d['y'].astype(str)).groupby('x')['y'].apply(list)
#failed with KeyError: ' y', not idea why :(
%timeit [[f'{x} {i}' for i in y] for x, y in df_1[['x','y']].to_numpy()]
76.3 ms ± 1.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)