Избегайте добавления нескольких строк в список l oop - PullRequest
3 голосов
/ 10 февраля 2020

Мне нужно обновить столбец DataFrame с некоторыми строками в выбранных строках, для которых у меня есть индекс. До сих пор мне удалось достичь того, что мне нужно, с помощью понимания списка:

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

, где data.particleIDs - это столбец DataFrame, который необходимо обновить, particlenames список, содержащий строки, и idx an массив, содержащий для каждой строки строку DataFrame, в которую она должна быть записана. Несколько строк соответствуют одной и той же строке, и мне нужно записать их все в столбец DataFrame.

Допустим, у меня есть DataFrame и список строк, которые я использую для его обновления:

data = pd.DataFrame({'particleIDs': [[] for i in range(20)]}
particlenames = ['c15001'+str(i) for i in range(10))]

У меня есть 10 строк, и мне нужно использовать их для обновления строк [7 8 15 8 11 0 15 1 12 8] в моем DataFrame, т.е. мне нужно добавить каждую строку в соответствующую строку.

FOR l oop ужасно медленно, так как фактический список particlenames длинный, и мне нужно повторить этот процесс несколько раз.

Что я могу сделать, чтобы ускорить это?

Спасибо!

1 Ответ

0 голосов
/ 11 февраля 2020

Я решил свою проблему, создав другой фрейм данных для строк и соответствующих индексов:

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 при создании data DataFrame (который в моем реальном случае имеет другие столбцы), так как объединенный столбец содержит необходимую информацию.

...