如何使用iterrows()创建新的数据框?

时间:2019-05-28 23:15:07

标签: python pandas dataframe

当我为每个客户创建新的数据框时,我也想创建一个将所有这些附加在一起的巨型数据框。

我创建了一个函数,可以根据需要对用户数据进行分组。现在,我要遍历另一个包含唯一用户密钥的数据框架,并使用这些用户密钥为每个用户创建数据框架。然后,我想将所有这些数据帧聚合为一个巨型数据帧。

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。

2 个答案:

答案 0 :(得分:1)

如@unutbu的advised所示:切勿在for循环内调用DataFrame.appendpd.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