在 for 循环中创建 pandas dfs
Posted
技术标签:
【中文标题】在 for 循环中创建 pandas dfs【英文标题】:Create pandas dfs in for loop 【发布时间】: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')
和其他水果。
【参考方案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']
【讨论】:
以上是关于在 for 循环中创建 pandas dfs的主要内容,如果未能解决你的问题,请参考以下文章
如何使用for循环或条件在pandas数据框的子集中创建多个回归模型(statsmodel)?
嵌套 for 循环的 Pandas 在创建的不同数据帧上插入多个数据
如何使用for循环创建一定长度的numpy数组(或pandas数据框)?