#python #pandas #iteration
#python #pandas #итерация
Вопрос:
У меня небольшая проблема с python.
Я хотел бы извлечь число «7» из списка чисел в каждой ячейке столбца в таблице большего размера. Число 7 обозначает, что в опрашиваемой семье есть холодильник.
Это мой текущий код:
raw_data = pd.read_csv('raw_data.csv')
test = raw_data["s6q68_electric_appliance"]
def check_has_refrigerator(input_value):
if "7" in input_value:
return True
return False
raw_data["has_refrigerator"] = test.apply(check_has_refrigerator)
Однако приведенный выше код не работает, поскольку python не может выполнять итерации по элементам с плавающей точкой. Мой вопрос в том, как я могу изменить значения в каждой ячейке, которые будут отображаться в виде строки, чтобы позволить python извлекать число «7» из каждой ячейки. В пределах заданной ячейки номера отображаются случайным образом, например, «7 10 11 12 13», и я хотел бы извлечь только число «7».
Спасибо.
Комментарии:
1.
"7"
это строка, а не число.7
или7.0
— это числа. Строки не могут быть равны числам. Строки также не могут быть больше или меньше чисел. Строки не являются числами2. Я не думаю, что «python не может выполнять итерацию по элементам с плавающей точкой» — это ваша проблема. Это утверждение не имеет смысла. Если бы у вас был список элементов с плавающей точкой, Python, безусловно, мог бы выполнить итерацию по этому списку. Я предполагаю, что проблема в том, что вы неправильно обработали данные в файле CSV, чтобы разрешить то, что вы просите. Вы должны показать нам, что делает test.apply() и как выглядит input_value .
3. в качестве примера, если у вас есть столбец со значением типа «7 10 11 12 13», вы хотели бы разделить это значение на уникальные числа. В данном случае это легко сделать с помощью «7 10 11 12 13».split(‘ ‘) . Тогда у вас был бы список, и вы могли бы сказать, если «7» в myList: , например. Это не требует обработки «7» как числа. Если вам не нужно выполнять арифметические вычисления или сравнивать две величины, эти вещи, возможно, могут оставаться строками. Просто для перехода к следующему шагу, если вам действительно нужны числа, вы могли бы сделать это: myList = [float(x) для x в «7 10 11 12 13».split(‘ ‘)] и у вас был бы список значений с плавающей точкой.
4. Если столбец содержит списки чисел в формате строки, как показано, то
apply
это совершенно не нужно, как естьsplit
.df['col1']=df['col'].str.contains('7')
позволяет избежать итерации вообще
Ответ №1:
Если я правильно понимаю, у вас есть строка, которая представляет список значений int, разделенных пробелами. Следовательно, вам нужно было бы разделить(‘ ‘), а затем проверить, есть ли 7?
например
set_of_int = set(text.split(' '))
seven_is_in = ("7" in set_of_int)
или
set_of_int = set(map(int,text.split(' ')))
seven_is_in = (7 in set_of_int)
Комментарии:
1. set_of_int в этом случае не будет набором целых чисел, потому что split() выдаст вам список строк. Итак, чтобы это работало с наименьшими изменениями, вам нужно («7» в list_of_int) . То, что вы, вероятно, хотите, это set([int(x) для x в text.split(‘ ‘)])
2. Да, извините, стремился к «7», написал слишком быстро, исправлю
Ответ №2:
Я думаю, это так просто:
def check_has_refrigerator(input_value):
if "7" in input_value.split(' '):
return True
return False
предполагая, что input_value выглядит как «7 10 11 12 13».
Ответ №3:
Спасибо всем. Я довольно новичок в Python, поэтому приношу свои извинения за то, что не был так ясен с первоначальным вопросом, Стивен! Теперь это работает, я использовал подход Дж. Андерсона. Спасибо!