Вычтите партию колонн в пандах - PullRequest
0 голосов
/ 21 ноября 2018

Я перехожу к использованию панд для обработки моих наборов данных CSV.В настоящее время я пытаюсь сделать в пандах то, что я уже очень легко делал в numpy: вычесть группу столбцов из другой группы несколько раз.Это по сути поэлементное вычитание матрицы.

Просто для справки: раньше это было моё решение для этого

def subtract_baseline(data, baseline_columns, features_columns):
    """Takes in a list of baseline columns and feature columns, and subtracts the baseline values from all features"""
    assert len(features_columns)%len(baseline_columns)==0, "The number of feature columns is not divisible by baseline columns"
    num_blocks = len(features_columns)/len(baseline_columns)    
    block_size = len(baseline_columns)                         
    for i in range(num_blocks):
        #Grab each feature block and subract the baseline
        init_col = block_size*i+features_columns[0]
        final_col = init_col+block_size
        data[:, init_col:final_col] = numpy.subtract(data[:, init_col:final_col], data[:,baseline_columns])
    return data 

Чтобы лучше проиллюстрировать, мы можем создать следующий набор игрушечных данных:

data = [[10,11,12,13,1,10],[20,21,22,23,1,10],[30,31,32,33,1,10],[40,41,42,43,1,10],[50,51,52,53,1,10],[60,61,62,63,1,10]]
df = pd.DataFrame(data,columns=['L1P1','L1P2','L2P1','L2P2','BP1','BP2'],dtype=float)

   L1P1  L1P2  L2P1  L2P2   BP1   BP2
0  10.0  11.0  12.0  13.0   1.0  10.0
1  20.0  21.0  22.0  23.0   1.0  10.0
2  30.0  31.0  32.0  33.0   1.0  10.0
3  40.0  41.0  42.0  43.0   1.0  10.0
4  50.0  51.0  52.0  53.0   1.0  10.0
5  60.0  61.0  62.0  63.0   1.0  10.0

правильный вывод будет результатом получения значений в L1P1 & L1P2 и вычитания G1P1 & G1P2 (AKA базовая линия), а затем повторения этого для L2P1, L2P2 и любых других столбцов, которые могут быть (это то, что цикл my for делает воригинальная функция).

   L1P1  L1P2  L2P1  L2P2   BP1   BP2
0   9.0   1.0  11.0   3.0   1.0  10.0
1  19.0  11.0  21.0  13.0   1.0  10.0
2  29.0  21.0  31.0  23.0   1.0  10.0
3  39.0  31.0  41.0  33.0   1.0  10.0
4  49.0  41.0  51.0  43.0   1.0  10.0
5  59.0  51.0  61.0  53.0   1.0  10.0

Обратите внимание, что метки для фрейма данных не должны изменяться, и в идеале я хотел бы, чтобы метод опирался на индексы столбцов, а не на метки, поскольку фактический блок данных состоит из 30 столбцов,не 2, как в этом примере.Так работала моя оригинальная функция в numpy, параметры baseline_columns и features_columns были просто списками индексов столбцов.

После этого базовые столбцы будут удалены все вместе из кадра данных, поскольку их функция уже выполнена.

Я попытался сделать это только для 1 пакета, используя iloc, но я получаю значения Nan

df.iloc[:,[0,1]] = df.iloc[:,[0,1]] - df.iloc[:,[4,5]]

   L1P1  L1P2  L2P1  L2P2  G1P1  G1P2
0   NaN   NaN  12.0  13.0   1.0  10.0
1   NaN   NaN  22.0  23.0   1.0  10.0
2   NaN   NaN  32.0  33.0   1.0  10.0
3   NaN   NaN  42.0  43.0   1.0  10.0
4   NaN   NaN  52.0  53.0   1.0  10.0
5   NaN   NaN  62.0  63.0   1.0  10.0

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Добавление .values в конце, pandas dataframe будет искать в столбце и совпадении индекса, чтобы выполнить вычитание, так как столбец не соответствует 0,1 и 4,5, он вернет NaN

df.iloc[:,[0,1]]=df.iloc[:,[0,1]].values - df.iloc[:,[4,5]].values
df
Out[176]: 
   L1P1  L1P2  L2P1  L2P2  BP1   BP2
0   9.0   1.0  12.0  13.0  1.0  10.0
1  19.0  11.0  22.0  23.0  1.0  10.0
2  29.0  21.0  32.0  33.0  1.0  10.0
3  39.0  31.0  42.0  43.0  1.0  10.0
4  49.0  41.0  52.0  53.0  1.0  10.0
5  59.0  51.0  62.0  63.0  1.0  10.0
0 голосов
/ 21 ноября 2018

Есть ли причина, по которой вы хотите сделать это в одной строке?Т.е. для ваших целей было бы неплохо сделать это с помощью двух строк:

df.iloc[:,0] = df.iloc[:,0] - df.iloc[:,4]
df.iloc[:,1] = df.iloc[:,1] - df.iloc[:,5]

Эти две строки достигают того, что я считаю вашим намерением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...