首页 > 解决方案 > 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 列相应列表中每个项目的前面?

谢谢!

标签: pythonpandas

解决方案


使用 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)

推荐阅读