Я перехожу к использованию панд для обработки моих наборов данных 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