2015-10-15 43 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的值做什么 –