2017-04-24 69 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