У меня есть DataFrame с именем df с более чем 40000 строк и более 90 столбцов.
Вот фрагмент того, на что это похоже:
p1 p2 p3 p4 value
0 1 0 1 5
1 0 1 0 4
1 1 0 0 6
0 1 0 1 2
Я бы хотел найти сумму 'value' для уникальных комбинаций p1, p2, p3, p4. Поэтому, когда p2 = 1 и p4 = 1 (в каждом наборе p1, p2, p3, p4 всегда есть ровно две единицы, сумма их столбца 'value' в этом случае будет равна 7. Это легко найти с df[(df.p2 == 1) & (df.p4 == 1)].value.sum()
.
Однако я понятия не имею, как это сделать для моего DataFrame df из-за его размера. Вместо p1-p4 он состоит из p1-p89.
Моя первоначальная идея состояла в том, чтобы создать новый столбец со значениями 89 столбцов, по которым я хочу фильтровать:
unique_list = []
for n in range(0,df.shape[0]):
unique_list.append(str(df.values[n][1:90]))
df['identifier'] = unique_list
Каждая строка будет иметь идентификатор для этих 89 значений, так что я могу просто отсортировать на основе этой строки. Однако это занимает довольно много времени. Я подсчитал, что это для l oop займет около 40 минут. Это не невыносимо долго - к тому времени, когда я закончу sh отправлять этот вопрос, он, вероятно, будет близок к завершению. Но ради обучения я не могу не думать, что для этого должен быть более эффективный метод.
Итак, есть ли? И есть ли способ сделать это без необходимости создания нового столбца идентификатора?
Если это имеет значение, моя конечная цель - создать новый DataFrame, в котором количество строк равно количеству уникальных комбинаций. р1-р89. Столбец 'value' в новом DataFrame будет суммой столбца 'value' для всех экземпляров этой комбинации в предыдущем DataFrame, а для каждой уникальной комбинации будет новый находить сумму столбца 'value'. р1-р89.