2015-10-15 44 views
1

我正在重寫我的一些代碼,並覺得必須有更好的更動態的方式來執行下面的操作。目前正如您所看到的,我正在根據行數創建條件並從中添加值。不過,我不想爲多個值製作靜態條件if row_count == 3:if row_count == 4:等等。我認爲肯定有更高效的方法來實現這一點。任何指針將不勝感激。根據熊貓數據幀的行數動態添加字典值

for root, dirs, files in os.walk(main): 
    filters = '*specificname*.csv' 
    for filename in fnmatch.filter(files, filters): 
     df = pd.read_csv(os.path.join(root, filename),error_bad_lines=False) 
     row_count = len(df.index) 
     device_dic = collections.defaultdict() 
     if row_count == 2: 
      device_dic[df.iloc[0][1]] = {} 
      device_dic[df.iloc[0][1]]['item1'] = df.iloc[0][2] 
      device_dic[df.iloc[0][1]]['item2'] = df.iloc[0][3] 
      device_dic[df.iloc[1][1]] = {} 
      device_dic[df.iloc[1][1]]['item1'] = df.iloc[1][2] 
      device_dic[df.iloc[1][1]]['item2'] = df.iloc[1][3] 
      for key in device_dic.iterkeys(): 
       device.append(key) 
+0

什麼用等於行鍵的字典計算要處理和值等於處理功能。多個鍵可以映射到相同的處理功能,您可以輕鬆地添加其他案例。 –

+0

@PaulJoireman您能否用一個例子來闡述一下? – iNoob

回答

0
def func1(device_dict): 

    device_dic[df.iloc[0][1]] = {} 
    device_dic[df.iloc[0][1]]['item1'] = df.iloc[0][2] 
    device_dic[df.iloc[0][1]]['item2'] = df.iloc[0][3] 
    device_dic[df.iloc[1][1]] = {} 
    device_dic[df.iloc[1][1]]['item1'] = df.iloc[1][2] 
    device_dic[df.iloc[1][1]]['item2'] = df.iloc[1][3] 
    for key in device_dic.iterkeys(): 
     device.append(key) 

    # Or whatever you want to return 
    return device 

def func2(device_dict): 
    # your code here 
    pass 



# Store each function in a dict 
process_map = {2 : func1, 3: func2, 4: func2, ...} 


for root, dirs, files in os.walk(main): 
    filters = '*specificname*.csv' 
    for filename in fnmatch.filter(files, filters): 
     df = pd.read_csv(os.path.join(root, filename),error_bad_lines=False) 
     row_count = len(df.index) 
     device_dic = collections.defaultdict() 

     # Could also use get() to provide a default processing func 
     process_func = process_map[row_count] 

     result = process_func(device_dict) 
+0

說實話,我不知道你在做什麼 – iNoob

+0

本質上,我使用''process_map''字典作爲可擴展的條件選擇器。當''row_count''爲2時,代碼從地圖選擇''func1''來處理數據。對於其他行計數,您將該數字作爲一個鍵插入,併爲該值定義一個新函數(即''func2'')。 –

+0

我假設你想爲不同的行計數做一些不同的處理,這只是提供了一種方法來封裝處理在一個單獨的函數,並快速選擇基於row_count的值做什麼 –