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

Posted

技术标签:

【中文标题】避免 FOR 循环将多个字符串附加到列表中【英文标题】:Avoid FOR loop to append several strings to list 【发布时间】:2020-05-26 05:44:05 【问题描述】:

我需要在选定的行中使用一些字符串更新 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 列表很长,我需要多次重复此过程。

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

谢谢!

【问题讨论】:

一些输入输出数据可以帮助我们更好地理解您的问题,请提供minimal reproducible example 完成!希望它更清楚。 那么预期的结果是什么?您正在多次更新同一行(例如,行8 更新了三次,值为“c150011”、“c150013”和“c150019”)。 是的,我需要那个!我也尝试使用 .loc,但我无法得到那个结果。 【参考方案1】:

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

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

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

【讨论】:

以上是关于避免 FOR 循环将多个字符串附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

使用 for 循环有没有办法控制哪个 # 循环将值附加到列表中?

Python For循环仅将最后一个值附加到列表

Python:替换多个 for 循环、多个迭代器

如何在for循环中将数据附加到空列表?

将for循环中的字符串值添加到列表中[重复]

从python中的for循环返回值