#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. о, я немного опоздал, но, похоже, вы нашли решение. приветствия!