2017-04-24 64 views
2

我创建通过配对下来基于一个选择非常的大数据帧(约400列)一个数据帧几列一个终端用户,使上一个选秀名单。选项列表中的一个选项是最终用户想要的分母类型。这是一个示例表,其中包含所有信息,然后进行最终计算。鸿沟蟒蛇数据帧在分子和分母列会根据领料单

   county _tcount _tvote _f_npb_18_count _f_npb_18_vote 
countycode                  
35    San Benito 28194 22335    2677   1741 
36   San Bernardino 912653 661838   108724   61832 



countycode   _f_npb_30_count _f_npb_30_vote         
35      384    288 
36     76749   53013 

不过,我的麻烦创建代码,会自动将每列开始的第5(不包括指数)由前柱(跳过隔列)。我见过例子(Divide multiple columns by another column in pandas),但它们都使用固定的列名,这在这方面是无法实现的。我可以通过固定列来变化列(基于位置),但是不能通过基于位置的其他变量列来变量列。我已经尝试在基于列的位置以上的链接修改代码:在遇到无效值时 (abs_vals> 0)):

calculated_frame = [county_select_frame[county_select_frame.columns[5: : 2]].div(county_select_frame[4: :2], axis=0)] 

输出:

[   county _tcount _tvote _f_npb_18_count _f_npb_18_vote \ 
countycode               
35   NaN  NaN  NaN    NaN    NaN 
36   NaN  NaN  NaN    NaN    NaN] 

RuntimeWarning。任何()

采用[5: :2]不工作的时候分红是固定field.If我不能得到这个工作,它不是一个大问题(但拥有我想要的所有选项将会很棒)。

回答

1

我认为你可以除以numpy array s创建的values,因为那样就不会对齐列名。

arr = county_select_frame.values 
df1 = pd.DataFrame(arr[:,5::2]/arr[:,4::2], columns = county_select_frame.columns[5::2]) 

样品:最后通过构造函数创建新DataFrame

np.random.seed(10) 
county_select_frame = pd.DataFrame(np.random.randint(10, size=(10,10)), 
            columns=list('abcdefghij')) 
print (county_select_frame) 
    a b c d e f g h i j 
0 9 4 0 1 9 0 1 8 9 0 
1 8 6 4 3 0 4 6 8 1 8 
2 4 1 3 6 5 3 9 6 9 1 
3 9 4 2 6 7 8 8 9 2 0 
4 6 7 8 1 7 1 4 0 8 5 
5 4 7 8 8 2 6 2 8 8 6 
6 6 5 6 0 0 6 9 1 8 9 
7 1 2 8 9 9 5 0 2 7 3 
8 0 4 2 0 3 3 1 2 5 9 
9 0 1 0 1 9 0 9 2 1 1 

arr = county_select_frame.values 
df1 = pd.DataFrame(arr[:,5::2]/arr[:,4::2], columns = county_select_frame.columns[5::2]) 
print (df1) 
      f   h   j 
0 0.000000 8.000000 0.000000 
1  inf 1.333333 8.000000 
2 0.600000 0.666667 0.111111 
3 1.142857 1.125000 0.000000 
4 0.142857 0.000000 0.625000 
5 3.000000 4.000000 0.750000 
6  inf 0.111111 1.125000 
7 0.555556  inf 0.428571 
8 1.000000 2.000000 1.800000 
9 0.000000 0.222222 1.000000 
0

如何像

cols = my_df.columns 
for i in range(2, 6): 
    print(u'Creating new col %s', cols[i]) 
    my_df['new_{0}'.format(cols[i]) = my_df[cols[i]]/my_df[cols[i-1] 
1

我更倾向于将通过设置指标,并使用filter分裂组织它单独计算并投票数据框。然后使用join

d1 = df.set_index('county', append=True) 
counts = d1.filter(regex='.*_\d+_count$').rename(columns=lambda x: x.replace('_count', '')) 
votes = d1.filter(regex='.*_\d+_vote$').rename(columns=lambda x: x.replace('_vote', '')) 

d1[['_tcount', '_tvote']].join(votes/counts) 

          _tcount _tvote _f_npb_18 _f_npb_30 
countycode county            
35   San Benito  28194 22335 0.650355 0.750000 
36   San Bernardino 912653 661838 0.568706 0.690732