避免 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 循环将多个字符串附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章