Как мне отфильтровать Pandas DataFrame на основе значений во многих, многих столбцах? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть 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.

1 Ответ

2 голосов
/ 11 апреля 2020

Похоже, вы могли бы сделать это с groupby.

# Get everything except the value column.
group_cols = [o for o in df.columns if o != 'value']

# Group into unique combinations, sum the value column.
unique_counts = df.groupby(group_cols).sum().reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...