在python数据帧中划分多个列,其中分子和分母列都将根据picklis而变化

2024-05-16 06:41:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个数据帧,它基于最终用户在选择列表上所做的选择,将一个非常大的数据帧(大约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),但它们都使用固定的列名,这在这方面是不可能实现的。我可以通过固定列改变列(基于位置),但不能通过其他基于位置的可变列来改变列。我尝试过根据列位置修改上述链接中的代码:

^{pr2}$

输出:

[           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: invalid value encountered in greater (abs_vals > 0)).any()

当红利是固定的时,[5: :2]的使用是有效的字段。如果我不能让这个工作,这不是什么大不了的(但如果有我想要的所有选项那就太好了)。在


Tags: 数据代码in列表选项countnansan
3条回答

我的首选是通过设置索引并使用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

像这样的东西怎么样

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] 

我认为您可以除以由^{}创建的numpy arrays,因为这样就不会对齐列名。上次按构造函数新建DataFrame

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

样品:

^{pr2}$

相关问题 更多 >