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

时间:2020-02-10 20:58:55

标签: python dataframe for-loop append list-comprehension

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

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

其中data.particleIDs是需要更新的DataFrame列,particlenames是一个包含字符串的列表,而idx是一个数组,对于每个字符串,该数组都需要更新写。几个字符串对应于同一行,我需要将它们全部写在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列表很长,我需要重复此过程几次。

我有什么办法可以加快速度吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我通过为字符串和对应的字符串创建另一个数据框解决了我的问题 索引:

df_strings = pd.DataFrame({'strings':particlenames,'rows':[7, 8, 15, 8, 11, 0, 15, 1, 12, 8]})

,然后在行上使用groupby方法以将字符串附加apply(list)

df_strings=df_strings.groupby('rows')['strings'].apply(list).reset_index()   

最后,我将join这个新的DataFrame与data一起使用字符串进行更新:

data=data.join(df_strings.set_index('rows'))

data=

    particleIDs     strings
0   []  [c150015]
1   []  [c150017]
2   []  NaN
3   []  NaN
4   []  NaN
5   []  NaN
6   []  NaN
7   []  [c150010]
8   []  [c150011, c150013, c150019]
9   []  NaN
10  []  NaN
11  []  [c150014]
12  []  [c150018]
13  []  NaN
14  []  NaN
15  []  [c150012, c150016]
16  []  NaN
17  []  NaN
18  []  NaN
19  []  NaN

因此,我可以避免在创建particleIDs DataFrame(在我的实际情况下,它具有其他列)时添加data,因为联接的列包含我所需的信息。

相关问题