2017-12-27 171 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)