【问题标题】:How to convert dictionary of DataFrames into individual DataFrames (Python, Pandas)如何将 DataFrame 的字典转换为单独的 DataFrame(Python、Pandas)
【发布时间】:2020-08-06 23:50:24
【问题描述】:

我有一个包含 4 列的原始数据框(例如,我们将它们称为 product_id、year_month、week、order_amount)和 > 50,000 行。有 240 个单独的 product_id 值,每个值在数据中的行为都不同,因此我想根据单独的 product_id 从原始数据帧创建单独的数据帧。我可以通过以下方式做到这一点:

dict_of_productid = {k: v for k, v in df.groupby('product_id)}

这创建了一个字典,其键是 product_id,值是列:product_id、year_month、week、order_amount。字典中的每个项目还保留了原始 df 的索引。例如:如果 product_id = dvvd56 位于第 4035 行,那么在字典中它将位于为 product_id dvvd56 创建的数据帧上,但索引仍为 4035。

我现在坚持的是一个以 df 作为值的字典,但找不到将这些值转换为我可以使用和操作的单个数据帧的方法。如果有办法做到这一点,请告诉我!我将不胜感激。谢谢

【问题讨论】:

  • 你试过了吗:dict_of_productid = {k: v for k, v in df.groupby('product_id').reset_index()}
  • 我不确定我是否理解 - dict 值已经是 DataFrame 对象。你在挣扎什么?还有你到底想在这里完成什么,因为我很确定这不是最好的方法。如果你的意思是你希望这些命名为df1df2df3,那么最好还是坚持使用dict_of_productid['dvvd56'] 等来访问它们。
  • 有 240 个单独的 product_id,我可以像你说的那样调用每个值,执行 `dict_of_productid['dvvd56'] 但我必须对所有 240 个值都这样做。我在问是否有一种更简单的方法可以做到这一点,不会让我明确地为它们中的每一个编写代码。
  • 这样说吧。你对这些DataFrames 的意图是什么?您是想要操纵这些的副本(即原始df 未被触及),还是想要传播原始df 本身的更改?如果是前一种情况,您无法真正摆脱在单个名称或 dict 值中单独引用。如果是第二种情况,那么您想对这些组做什么?这可能是可以实现的,而无需您首先将它们分开。
  • 如果您对这 240 个 product_id 中的每一个都有某种相同的过程,那么您不需要关心各个帧,您可以直接在 df 本身上操作它并内置在函数中,或者如果您需要满足条件,请使用df.apply

标签: python pandas dataframe dictionary pandas-groupby


【解决方案1】:

我找到了解决此问题的方法,但我不知道这是否是最合适的方法,但它可能有助于进一步回答以澄清我想要做什么。

第一步是将唯一值转换为列表,然后按顺序对它们进行排序:

product_id_list = df['product_id'].value_counts().index.to_list()
product_id_list = sorted(product_id_list)

完成此操作后,我创建了一个公式,然后使用 product_id_list 的各个值对其进行迭代:

def get_df(key): 
    for k in key: 
        df_productid = dict_of_productid[k]
    return df_productid

for c, i in enumerate(product_id_list):
    globals()[f'df_{c}'] = get_df([f'{i}'])

这让我现在可以将创建的字典的所有值分隔成单独的数据帧,我可以在不明确说明产品 ID 的情况下调用这些数据帧。我可以做df_1 并获取数据框。

(我不知道这是否是最有效的方法)

【讨论】:

  • 这可行,但我不建议像这样直接操作globals()This is a relevant thread with multiple solutions for what you're doing here。我建议使用您拥有的dict,因为它易于维护和引用。 dict_of_productid['dvvd56']df_1df_2 等更容易理解,并且您还可以通过迭代 dict 而不是 func(df_1)func(df_2) 等来保持应用相同功能的能力。
猜你喜欢
  • 2021-11-08
  • 2017-12-26
  • 2014-12-30
  • 2019-10-27
  • 2018-10-26
  • 2019-12-09
  • 2021-11-10
相关资源
最近更新 更多