当我为每个客户创建新的数据框时,我也想创建一个将所有这些附加在一起的巨型数据框。
我创建了一个函数,可以根据需要对用户数据进行分组。现在,我要遍历另一个包含唯一用户密钥的数据框架,并使用这些用户密钥为每个用户创建数据框架。然后,我想将所有这些数据帧聚合为一个巨型数据帧。
for index, row in unique_users.iterrows():
customer = user_df(int(index))
print(customer)
此功能按预期工作,并为每个客户打印df
for index, row in unique_users.iterrows():
top_users = pd.DataFrame()
customer = user_df(int(index))
top_users = top_users.append(customer)
print(top_users)
这只会打印出最后一个客户的df
我希望在迭代并创建新客户df时将其附加到top_user df,因此最后我会有一个巨大的top_user df。但是,它只包含最后一个客户的df。
答案 0 :(得分:1)
如@unutbu的advised所示:切勿在for循环内调用DataFrame.append
或pd.concat
。这样会导致二次复制。相反,构建一个数据帧列表以在循环外调用pd.concat
一次。
实际上,您可以使用列表/字典理解来处理数据框架构建,而无需使用iterrows
,而是直接使用索引值。无论使用哪种理解,都可以避免初始化容器并对其进行迭代分配的记账工作。
# LIST COMPREHENSION APPROACH
df_list = [user_df(int(idx)) for idx in unique_users.index.values]
top_users = pd.concat(df_list, ignore_index=True)
# DICTIONARY COMPREHENSION APPROACH
df_dict = {idx: user_df(int(idx)) for idx in unique_users.index.values}
top_users = pd.concat(df_dict, ignore_index=True)
答案 1 :(得分:0)
这就是我所做的:
_list = []
for index, row in unique_users.iterrows():
r = row.to_dict() # Converting the row to dictionary
_list.append(r) # appending the dictionary to list
return pd.DataFrame(_list) # Converts list of dictionaries to a dataframe