2017-12-27 120 views
0

我有一些代码目前看起来是这样的:优雅的方式与多个dataframes工作,大熊猫

if os.path.isfile('D:\\df_1'): 
    df_1 = pd.read_pickle('D:\\df_1') 
else: 
    df_1 = pd.DataFrame(columns = ['Date', 'Location', 'Product']) 
if os.path.isfile('D:\\df_2'): 
    df_2 = pd.read_pickle('D:\\df_2') 
else: 
    df_2 = pd.DataFrame(columns = ['Date', 'Location', 'Product']) 

[...] 

if os.path.isfile('D:\\df_20'): 
    df_20 = pd.read_pickle('D:\\df_20') 
else: 
    df_20 = pd.DataFrame(columns = ['Date', 'Location', 'Product']) 

基本上我做的是检查,如果数据帧已经存在,如果它不加载它否则创建一个空的数据框。我需要这样做,因为代码会尝试将新数据附加到每个数据帧。所以,我会碰到这样的:

[retrieve new data and clean it] 
df_1 = pd.concat([df_1, df_1_new_data]) 

这样做对所有的20个dataframes我有(它们含有不同的东西,所以我想将它们分开),然后将其保存,以当日再次检索它们并添加新的数据给他们:

df_1.to_pickle('D:\\df_1') 
df_2.to_pickle('D:\\df_2') 
[...] 
df_20.to_pickle('D:\\df_20') 

现在,它已经非常沉重,做20个数据帧,但我可能需要添加更多!有没有办法读取不同的数据框,然后将它们写入for循环或类似的东西?那么为了减少我现在有许多简单的2行代码循环的代码行?谢谢!

+0

你为什么不在循环中做这些事情? –

+0

我需要动态地创建变量名称,并且我知道这将是一件坏事。 – giga

+0

使用字典。 –

回答

2

DRY:你不应该多次写相同的东西(不止一次)。

使用函数,循环,其他基本语言工具。

def create_df(path): 
    if os.path.isfile(path): 
     df = pd.read_pickle(path) 
    else: 
     df = pd.DataFrame(columns = ['Date', 'Location', 'Product']) 
    return df 

all_paths = (...) 

# dict where key is you path and value is dataframe  
all_df = {p: create_df(p) for p in all_paths} 

for p in all_paths: 
    all_df[p].to_pickle(p)