【问题标题】:Avoid FOR loop to append several strings to list避免 FOR 循环将多个字符串附加到列表中
【发布时间】: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,但我无法得到那个结果。

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


【解决方案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(在我的实际情况下,它还有其他列),因为连接的列包含我需要的信息。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 2022-12-15
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    相关资源
    最近更新 更多