在for循环熊猫中创建多个数据帧



我是python中的beginer。

我有三个结构相似的数据集,我想对每个数据集执行相同的过程并保存结果。我的代码运行得很好,但它只保存最后一个碱基的结果。?如何将结果保存在三个不同的数据集中?

我的代码看起来像:

bases = [base1, base1_a, base1_b]
for base in bases:
base = base.groupby(["Cliente_id", "Periodo_id"]).agg({"monto_2018": ["sum", "mean", "min", "max"]}).reset_index().round(1)
base.columns = base.columns.get_level_values(1)
base = base.set_axis(["Cliente_id", "Periodo_id", 'sum_v', 'mean_v', 'min_v', "max_v"], axis=1, inplace=False)
bases = [base1, base1_a, base1_b]
for base in bases:
base = base.groupby(["Cliente_id", "Periodo_id"]).agg({"monto_2018": ["sum", "mean", "min", "max"]}).reset_index().round(1)
base.columns = base.columns.get_level_values(1)
base = base.set_axis(["Cliente_id", "Periodo_id", 'sum_v', 'mean_v', 'min_v', "max_v"], axis=1, inplace=False)

当您在循环中分配base = base.groupby()时,您正在重新分配变量base以引用作为groupby()操作结果的新数据帧。这不会修改原始bases列表。

要获得新数据帧的列表,只需创建一个新列表:

bases = [base1, base1_a, base1_b]
results = [] # -----------------------------> create an empty list
for base in bases:
base = base.groupby(["Cliente_id", "Periodo_id"]).agg({"monto_2018": ["sum", "mean", "min", "max"]}).reset_index().round(1)
base.columns = base.columns.get_level_values(1)
base = base.set_axis(["Cliente_id", "Periodo_id", 'sum_v', 'mean_v', 'min_v', "max_v"], axis=1, inplace=False)
results.append(base) # ------------------> Add dataframe to the new list

我在这里选择了名称results作为通用名称。我强烈建议你使用一个不同的名字,更能描述你正在做的事情。

避免在全局环境中将结构相似的数据帧保存为单独的对象。现在是三,但很容易达到300!相反,继续使用列表(bases = [base1, base1_a, base1_b](或更好的字典,如下所示,然后使用用户定义的方法通过列表或字典理解来处理它。下面使用命名聚合来避免列标题操作。

# ASSIGN DATA FRAMES IN DICTIONARY 
# IDEALLY. YOU CREATE DICT DIRECTLY FROM SOURCE VIA read_* METHODS
df_dict = {"base1": base1, "base1_a": base1_a, "base1_b": base1_b}
def process_data(base):
base = (
base.groupby(["Cliente_id", "Periodo_id"], as_index=False)
.agg(
sum_v=("monto_2018", "sum"),
mean_v=("monto_2018", "mean"),
min_v=("monto_2018", "min"),
max_v=("monto_2018", "max")
)
.round(1)
)
return base
# DICTIONARY COMPREHENSION TO ITERATE THROUGH ALL DATA FRAMES
new_df_dict = { k:process_data(v) for k,v in df_dict.items() }

然后根据需要调用字典元素,因为如果保存在类似列表或dict:的容器中,则不会丢失数据帧的功能

new_df_dict["base1"].head()
new_df_dict["base1_a"].tail()
new_df_dict["base1_b"].describe()

最新更新