在熊猫中更容易进行列分割

时间:2015-04-15 17:40:19

标签: python pandas

我有16列。我想将每个count列划分为各自的dc(uid)列。

+------------------------+------------------------------+--------------------------+------------------------------------+-------------------------------------+------------------------+---------------------+--------------------------+--------------------------------+----------------------------+--------------------------------------+---------------------------------------+--------------------------+-----------------------+
| count: interaction_eis | count: interaction_eis_reply | count: interaction_match | count: interaction_single_message_ | count: interaction_single_message_1 | count: interaction_yes | count: revenue_sale | dc(uid): interaction_eis | dc(uid): interaction_eis_reply | dc(uid): interaction_match | dc(uid): interaction_single_message_ | dc(uid): interaction_single_message_1 | dc(uid): interaction_yes | dc(uid): revenue_sale |
+------------------------+------------------------------+--------------------------+------------------------------------+-------------------------------------+------------------------+---------------------+--------------------------+--------------------------------+----------------------------+--------------------------------------+---------------------------------------+--------------------------+-----------------------+

我知道我可以这样做:

pre_purch_m['interaction_eis_rate'] = pre_purch_m['count: interaction_eis'] / pre_purch_m['dc(uid): interaction_eis']
pre_purch_m['interaction_eis_reply_rate'] = pre_purch_m['count: interaction_eis_reply'] / pre_purch_m['dc(uid): interaction_eis_reply']

但这样做8次似乎多余而且费力。

是否有熊猫功能或范例以更有效的方式完成这样的事情?

2 个答案:

答案 0 :(得分:2)

让我们假设您的列是一致的。这是一种方法。

从数据框df获取列。

cols = df.columns

通过删除count:dc(uid):并获取唯一列表来获取唯一列。

uniq_cols = list(set([x.split(': ')[1] for x in cols]))

现在,循环创建新列。

for col in uniq_cols:
    df[col + '_rate'] = df['count: ' + col] / df['dc(uid): ' + col]

而且,如果最初通过存储这些uniq_cols来填充数据框会更容易。

答案 1 :(得分:0)

16列是连续的,所以有一种方法可以做到这一点:

 newdF = df[range(8)]/df[range(8, 16)].values

使用.values来阻止重新编制索引。

然后重命名列:

newdF.rename(columns = lambda x : x.replace(x, x[6:] + '_rate'), inplace='True')