Выберите строки, в которых несколько значений столбцов находятся в нескольких списках

#python #pandas

#python #pandas

Вопрос:

Я хочу выбрать значения из фрейма данных, такие как:

     Vendor_1   Vendor_2   Vendor_3
0   1          0          0
1   0          20         0
2   0          0          300
3   4          0          0
4   0          50         0
5   0          0          500 

 

Значения, которые я хочу сохранить от Vendor_1, 2, 3, находятся внутри отдельного списка, т.е. v_1, v_2, v_3. Например, скажем, скажем, v_1 = [1], v_2 = [20], v_3 = [500], то есть я хочу, чтобы остались только эти строки.

Я пробовал что-то вроде:

 df = df[(df['Vendor_1'].isin(v_1)) amp; (df['Vendor_2'].isin(v_2)) amp; ... ]
 

Это дает мне пустой фрейм данных, связана ли эта проблема с приведенной выше логикой или с тем, что не существует строк с этими ограничениями (крайне маловероятно в моем реальном фрейме данных).

Приветствия

Редактировать:

Хорошо, итак, я понял фундаментальное различие с моим примером и то, что на самом деле похоже на мой df, если есть значение для Vendor_1, тогда Vendor_2, 3 должно быть 0 и т.д. Итак, моя логика с цепочкой isin не имеет смысла, я обновлю пример df.

Итак, я чувствую, что мне нужно создать 3 подмножества, а затем объединить их или что-то в этом роде?

Комментарии:

1. Можете ли вы показать нам примеры данных? Выше должно работать

2. @BENY Я добавил несколько примеров

3. @BENY О, я вижу, вы сказали, что это должно сработать, к сожалению, мне не разрешено делиться данными, я думаю, я должен просто сделать еще несколько проверок на вменяемость

4. @BENY это не должно работать в приведенном выше примере, поскольку нет комбинации, которая удовлетворяет всем требованиям

5. @liamod это должно вернуть пустой фрейм данных с приведенными выше списками. Попробуйте с v_2=[20,30]

Ответ №1:

isin принимает словарь:

 d = {
    'Vendor_1':[1],
    'Vendor_2':[20],
    'Vendor_3':[500]
}

df.isin(d)
 

Вывод:

    Vendor_1  Vendor_2  Vendor_3
0      True     False     False
1     False      True     False
2     False     False     False
3     False     False     False
4     False     False     False
5     False     False      True
 

И затем, в зависимости от вашей логики, вы хотите проверить any или all :

 df[df.isin(d).any(1)]
 

Вывод:

    Vendor_1  Vendor_2  Vendor_3
0         1         0         0
1         0        20         0
5         0         0       500
 

Но если вы используете all в этом случае, например, вам требуется, чтобы Vendor_1=1 , Vendor_2=20 , и Vendor_3=500 должны выполняться в одних и тех же строках, и вы бы сохранили эти строки.

Ответ №2:

Приведенный вами пример должен работать, если только фактически нет строк, соответствующих этому условию.

Эти выражения немного сложны с скобками, поэтому я бы предпочел разделить строку на две части для упрощения отладки:

 mask = (df['Vendor_1'].isin(v_1)) amp; (df['Vendor_2'].isin(v_2))

# sanity check that the mask is selecting something
assert mask.any()

df = df[mask]
 

Обратите внимание, что у вас должны быть скобки между amp; ними из-за правил приоритета операторов.

Например:

введите описание изображения здесь

Комментарии:

1. Привет, пожалуйста, посмотрите мое редактирование, вопрос отличается от ожидаемого

2. о, я немного опоздал, но, похоже, вы нашли решение. приветствия!