#python #pandas #dataframe
Вопрос:
У меня есть следующее
# df1, df2, final_df have same index final_df = ... df1 = ... df2 = ... sum_cols = ['a', 'b', 'c'] final_df[sum_cols] = df1[sum_cols] df2[sum_cols]
Теперь я хочу сделать это для произвольного числа dfs
final_df = ... dfs = [df1, df2, df3, ...] # they all have same index final_df[sum_cols] = df1[sum_cols] df2[sum_cols] df3[sum_cols] ...
Как мне сделать это красиво, без цикла for?
Комментарии:
1. почему вы избегаете цикла for? я не понимаю, как это влияет на производительность, если вас это беспокоит. В любом случае, было бы проще, если бы вы поделились некоторыми образцами кадров данных с ожидаемым результатом
Ответ №1:
Вы можете использовать сокращение (или вы можете использовать цикл for).
import functools import operator sum_cols = ['a', 'b', 'c'] dataframes = [...] # list of dataframes final_df[sum_cols] = functools.reduce(operator.add, [d[sum_cols] for d in dataframes])
Сокращение имеет то преимущество sum()
, что оно не использует начальное значение (которое 0
по умолчанию используется для суммы).
Простое использование цикла также может быть приемлемым и коротким для записи. И эффективно, мы не создаем ненужные другие объекты или промежуточные звенья.
final_df[sum_cols] = dataframes[0][sum_cols] for d in dataframes[1:]: final_df[sum_cols] = d[sum_cols]
Вы даже можете попытаться сделать это только в операциях с пандами. Но я бы не рекомендовал этого делать. На данный момент мы просто тратим время, копируя данные:
final_df[sum_cols] = pd.concat([d[sum_cols] for d in dataframes], axis=1, keys=range(len(dataframes))).sum(level=1, axis=1)
pd.concat
есть возможность copy=False
, но на практике это в большинстве случаев не экономит копирование.
Альтернативы предоставляются для того, чтобы вам стало легче быть довольным.. с одним из них, может быть, просто петля? 🙂
Ответ №2:
Вы можете использовать sum()
функцию
final_df[sum_cols] = sum(dfs)
Если dfs-это все числа
Комментарии:
1. Я бы добавил
[sum_cols]
, чтобы сохранить одинаковое количество столбцов:final_df[sum_cols] = sum(dfs)[sum_cols]
2. Вероятно, вам нужно разрезать каждый df перед вызовом sum, чтобы избежать проблем с типами столбцов и избежать ненужной работы