【问题标题】:Create pandas dfs in for loop在 for 循环中创建 pandas dfs
【发布时间】:2020-02-08 20:07:41
【问题描述】:

我有以下数据框:

import pandas as pd
df = pd.DataFrame({'name':['apple', 'banana', 'apple', 'mandarin', 'kiwi', 'kiwi'], 'val':[1,5,3,4,5,3]})

我想创建单独的数据框,将水果名称传递给以下函数:

def split_all_fruits(df, fruit):
    return df[df['name'] == fruit]

然后我可以简单地调用函数来创建数据框:

apple_df = split_all_fruits(df, 'apple')
banana_df = split_all_fruits(df, 'banana')
#and other fruits

但我想在 for 循环中创建数据帧,而不是每次为每个水果调用函数。但是是否可以创建 for 循环,该循环会同时为每个水果从列表中生成 5 个带有数据帧名称的数据帧? 像这样的:

#name of dfs
name_of_dfs = ['apple_df', 'banana_df', 'mandarin_df', 'kiwi_df']
#fruit names in df
fruit_name = ['apple', 'banana', 'mandarin', 'kiwi']
#loop to create dfs, but i dont know how to assign list of names in name_of_dfs to respective fruit df
for fruit in fruit_name:
    df_final = split_all_fruits(df,fruit)
    print(df_final)
#it prints all dfs together, but not seperate df with name from list

谢谢!

【问题讨论】:

  • 在这些情况下,我使用创建字典。 Key = name_of_df 并为该数据框赋值。 dict['name_i'] = dataframe_i 不知道能不能动态创建变量,看看有没有人知道!干杯!
  • 你想要一个包含所有水果的数据框还是一个包含一个水果的数据框列表?
  • 检查eval
  • @alec_djinn 在这种情况下我想要 5 个单独的数据帧,其中数据帧名称来自列表:apple_df、banana_df、mandarin_df 和 kiwi_df。但我不想每次都像这样调用函数:apple_df = split_all_fruits(df, 'apple') banana_df = split_all_fruits(df, 'banana') 和其他水果。

标签: python pandas list for-loop


【解决方案1】:

虽然这可以使用eval()globals() 来完成,但更好(更简洁、更易于以编程方式管理)的方法是使用dict,例如:

dfs = {name: split_all_fruits(df, name) for name in fruit_name}

被访问为,例如:

dfs['apple']

编辑

如果您真的想要以 apple_df 等名称命名变量。一种方法是修改 globals() 字典,例如:

globals().update({name + '_df': split_all_fruits(df, name) for name in fruit_name})

被访问为,例如:

apple_df

请注意,这被认为是不好的做法!

【讨论】:

    【解决方案2】:

    如果您希望为每个水果生成一个数据框,您可以使用以下命令(注意顺序将根据水果名称按字母顺序排列):

    [d for name, d in df.groupby("name")]
    

    如果您需要按特定顺序列出的列表:

    [df.query("name == '{}'".format(f)) for f in fruit_name]
    

    如果您希望能够通过名称访问它们,您可以使用字典理解并引用水果名称:

    grouped = {name: d for name, d in df.groupby("name")}
    
    # e.g. for apple:
    apple_df = grouped['apple']
    

    最后,如果您需要列出具体变量并知道这些应该提前:

    grouped = {name: d for name, d in df.groupby("name")}
    
    apple_df, banana_df, mandarin_df, kiwi_df = [grouped[fruit] for fruit in fruit_name]
    

    【讨论】:

      【解决方案3】:

      如果您想要变量名而不是字典键(这不是一个好主意,但 OP 要求这样做),您可以使用 exec()

      #name of dfs
      name_of_dfs = ['apple_df', 'banana_df', 'mandarin_df', 'kiwi_df']
      fruit_name = ['apple', 'banana', 'mandarin', 'kiwi']
      
      for fruit, df_name in zip(fruit_name, name_of_dfs):
          exec(f'{df_name} = split_all_fruits(df, "{fruit}")')
          print(globals()[df_name])
      

      现在你可以直接访问变量了:

      print(apple_df)
      
          name  val
      0  apple    1
      2  apple    3
      

      【讨论】:

        【解决方案4】:

        你可以像下面这样修改你的最后一段代码

        name_of_dfs = ['apple_df', 'banana_df', 'mandarin_df', 'kiwi_df']
        #fruit names in df
        fruit_name = ['apple', 'banana', 'mandarin', 'kiwi']
        dfs = {}
        #loop to create dfs, but i dont know how to assign list of names in name_of_dfs to respective fruit df
        for fruit in fruit_name:
            df_final = split_all_fruits(df,fruit)
            dfs[fruit] = df_final
            print(df_final)
        

        然后,使用水果名称访问任何数据框。

        dfs['apple']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-10
          • 2019-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-25
          • 1970-01-01
          相关资源
          最近更新 更多