使用groupby()基于另外两列的值向pandas DataFrame添加一列

时间:2016-02-15 01:01:59

标签: python numpy pandas

我有一个非常大的数据文件,可以使用以下代码建模:

import pandas as pd
import numpy as np
import random

x = pd.DataFrame({'file_name': np.repeat(['csv_1', 'csv_2'], 32),
                  'side': np.tile(np.repeat(['n', 'f'], 16),2),
                  'ten_13':np.tile(np.repeat(['10', '13'], 8),4),
                  'rand_data': np.random.uniform(-1, 1, size=64)})

x = x.set_index(['file_name', 'side', 'ten_13'])
x.head()

我需要您的帮助,使用pandas的groupby()方法将名为web_col 的列添加到上述DataFrame x

web_col列取决于列sideten_13中值的组合,并且具有四个可能的序列值之一:

  • 1:8如果'side'='n'和'ten_13'='10'的值
  • 9:16如果'side'='n'和'ten_13'='13'的值
  • 17:24如果'side'='f'和'ten_13'='10'的值
  • 25:32如果'side'='f'和'ten_13'='13'的值

file_name包含各种csv文件;在下面的代码中它只有两个文件。每个文件都具有相同的sideten_13的确切值。

我使用numpy函数web_col创建了此np.where()列,但我想使用pandas' groupby()np.where()代码如下:

ten_13 = x.index.get_level_values('ten_13')
side   = x.index.get_level_values('side')

n_10 = ((ten_13 == '10') & (side == 'n')).reshape(-1,8)
n_13 = ((ten_13 == '13') & (side == 'n')).reshape(-1,8)
f_10 = ((ten_13 == '10') & (side == 'f')).reshape(-1,8)
f_13 = ((ten_13 == '13') & (side == 'f')).reshape(-1,8)

web_col = np.where(n_10, np.arange(1, 9, 1),
                   np.where(f_10, np.arange( 17, 25, 1),
                            np.where(n_13, np.arange(9, 17, 1),
                                     np.where(f_13, np.arange(25,33, 1), np.arange(1, 9, 1)))))
x['web_col'] = web_col.reshape(64,1)
x.head()

1 个答案:

答案 0 :(得分:-1)

可以使用pandas.apply(),但考虑到你只有4个条件,以下可能效率更高。

x.loc[(x['side'] == 'n') & (x['ten_13'] == '10'), 'web_col'] = '1:8'
... for each condition

如果您设置了适当的索引,这将更快。

x.set_index(['side', 'ten_13'], inplace=True)
x.sortlevel(inplace=True)  # speeds up lookups
x.loc[('n', '10'), 'web_col'] = '1:8'
... for each condition
x.reset_index(inplace=True) # to restore original dataframe