避免FOR循环将多个字符串追加到列表中

问题描述 投票:2回答:1

我需要在选定的行上使用一些字符串更新DataFrame列,为此我有了索引。到目前为止,我已经可以通过列表理解来实现所需的功能:

[data.particleIDs.values[idx[i]].append(particlenames[i]) for i in range(len(idx))]

其中data.particleIDs是需要更新的DataFrame列,particlenames是一个包含字符串的列表,而idx是一个数组,该数组包含每个字符串需要写入的DataFrame行。几个字符串对应于同一行,我需要将它们全部写在DataFrame列中。

假设我有一个DataFrame和用于更新它的字符串列表:

data = pd.DataFrame({'particleIDs': [[] for i in range(20)]}
particlenames = ['c15001'+str(i) for i in range(10))]

我有10个字符串,我需要使用它们来更新DataFrame中的行[7 8 15 8 11 0 15 1 12 8],即,我需要将每个字符串添加到相应的行中。

FOR循环非常慢,因为实际的particlenames列表很长,我需要重复此过程几次。

有什么我可以做的来加快速度吗?

谢谢!

python dataframe for-loop append list-comprehension
1个回答
0
投票

我不知道.append函数为什么会被公开,因为它会导致各种问题。

如果您的数据框有十行,而您又追加了一行,则返回的数据框是现有数据框的copy加一行。这被称为二次复制,会导致严重的性能影响。

您要做的是用新数据创建一个新的数据框,然后将其与现有的数据框连接起来,可能会根据您的上下文重置/忽略索引。

df_new = pd.DataFrame(...)  # Column names must match.
pd.concat([data, df_new]).reset_index(drop=True)

请参阅我在此相关文章中的回复。 Using pandas .append within for loop

编辑

鉴于您已编辑的问题,您只需使用loc

data.loc[[7, 8, 15, 8, 11, 0, 15, 1, 12, 8], 'particleIDs'] = particlenames
>>> data
   particleIDs
0      c150015
1      c150017
2           []
3           []
4           []
5           []
6           []
7      c150010
8      c150019
9           []
10          []
11     c150014
12     c150018
13          []
14          []
15     c150016
16          []
17          []
18          []
19          []
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.