我需要在选定的行上使用一些字符串更新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
列表很长,我需要重复此过程几次。
有什么我可以做的来加快速度吗?
谢谢!
我不知道.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 []