Как добавить произвольное количество кадров данных

#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, чтобы избежать проблем с типами столбцов и избежать ненужной работы