我有以下数据框:
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循环中创建数据帧,而不必每次为每个水果调用funtion。但是是否可以创建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
谢谢!
答案 0 :(得分: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
请注意,尽管这被认为是不好的做法!
答案 1 :(得分:1)
如果您希望为每个水果生成一个数据框,则可以使用以下内容(请注意,根据水果名称的顺序,字母顺序为:)
[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]
答案 2 :(得分:1)
如果您要使用变量名而不是字典键(这不是一个好主意,但这是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
答案 3 :(得分:0)
您可以像下面那样修改最后一段代码
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']