2014-09-04 34 views
2

我在python中遍歷50個文件,並將它們分別轉換爲熊貓數據框。然後,從每個數據幀中,我根據原始數據幀中特定字段中的值創建三個新數據幀。這三個新框架具有新名稱,其中包括它們被過濾的值。使用全局變量()調用熊貓數據框內部For循環

它的作品,耶!我得到我所有的數據幀!

的問題是,我使用的是一個全球性的()調用創建這些數據幀,我不知道如何在不明確鍵入每個單獨的數據幀名到籽粒訪問它們。

爲什麼我想這樣做,你可能會問?

嗯,我想抓住所有的數據幀爲此在「CD」,例如,和append(UNION ALL),他們進入最終的數據幀。我不想明確地要求全部50個。我想遍歷數據框的列表來完成這個任務。

有關如何完成此操作或重寫代碼的任何建議?

我不熟悉iPython這些更密集的流程,所以改變一切。

filelist = os.listdir() 
    sum_list = ['CAKE', 'TWINKIES', 'DOUGHNUTS', 'CUPCAKES'] 
    for f in filelist: 
     state = re.match('((\w+){2})\_', f) 
     state_df = str(state.group(1)) + '_df' 
     data = pd.read_csv(f, low_memory = False) 
     df = pd.DataFrame(data) 
     for x in sum_list: 
      sdo = state_df + '_' + x.lower() 
      globals()[sdo] = pd.DataFrame(df.loc[df['summary_level'] == x]) 

回答

1

我覺得一個更好的方法是創建自己的字典,而不是求助於全局變量!只需創建自己的附加列表或列表的字典? (取決於分類):

dfs = {} 
for f in filelist: 
    ... 
    df = pd.read_csv(f) # this returns a DataFrame 
    for x in sum_list: 
     ... 
     dfs[sdo] = df[df.summary_level == x] # again, this return a DataFrame 

你可以使用默認的字典,每一個分配給子詞典:

from collection import defaultdict 
dfs = defaultdict({}) 
... 
     dfs[x][sdo] = ... 

dfs['CAKE']將所有蛋糕DataFrames。

+0

嘿,謝謝!最終做的不是你所建議的,而是讓我以不同的方式思考這個問題。 – Audrey 2014-09-09 18:52:28

+0

@Audrey太棒了!希望你在享受熊貓! – 2014-09-09 18:55:40