#python #pandas
#python #pandas
Вопрос:
У меня есть этот скрипт, и я пытаюсь добавить оператор if, если столбец GTIN пуст, тогда значение столбца excluded_destination должно быть FALSE, иначе TRUE. Я не уверен, как проверить столбец GTIN.
Вот мой код:
import pandas as pd
ed = pd.read_csv('/export.csv')
df = ed[['ItemID', 'ProductUrl', 'RetailPrice', 'ItemName', 'ItemName', 'ItemPrimaryImageUrl'
, 'CategoryList', 'Manufacturer', 'GTIN', 'ProductStatus','CategoryList', 'ItemNumber']]
def build_csv():
df.insert(0, 'expiration_date', '2020-12-24')
df.insert(7, 'additional_image_link', ' ')
df.insert(9, 'condition', 'new')
df.insert(10, 'shipping_weight', '0.0000 lb')
df.insert(12, 'pattern', ' ')
df.insert(16, 'tax', 'US::0:n')
df.insert(17, 'promotion_id', '')
df.insert(18, 'color', '')
df.insert(19, 'size', '')
df.insert(20, 'shipping', ':::0.00')
df.insert(22, 'item_group_id', ' ')
df.insert(23, 'adwords_grouping', ' ')
df.insert(24, 'adword_labels', ' ')
df.insert(25, 'custom_label_0', ' ')
df.insert(26, 'custom_label_1', ' ')
df.insert(27, 'custom_label_2', ' ')
df.insert(28, 'custom_label_3', ' ')
df.insert(29, 'shipping_label', '1')
df.insert(30, 'excluded_destination', ' ')
if df['GTIN'] != ' ':
df.insert(31, 'identifier_exists', 'TRUE')
else:
df.insert(31, 'identifier_exists', 'FALSE')
df.columns =['expiration_date','id', 'link', 'price', 'title', 'description','image_link', 'additional_image_link'
, 'product_type', 'condition', 'shipping_weight','brand', 'pattern', 'gtin', 'availability', 'google_product_category'
,'tax', 'promotion_id', 'color', 'size','shipping','mpn', 'item_group_id', 'adwords_grouping', 'adword_labels'
, 'custom_label_0', 'custom_label_1', 'custom_label_2', 'custom_label_3', 'shipping_label', 'excluded_destination'
, 'identifier_exists']
df.to_csv('/home/d_google_file.csv')
build_csv()
Комментарии:
1. Поскольку вы все равно сбрасываете df.columns непосредственно перед записью в файл csv, вам не нужно выполнять инструкции insert. Вместо этого вы можете просто сделать простой
df['expiration_date'] = '2020-12-24'
и так далее. Оператор df.columns сбросит столбцы в указанном вами порядке.2. Вы также можете указать что-то вроде этого:
df[['Test1','Test2']] = ['A','B']
. В этом случаеTest1
будет присвоено значениеA
иTest2
будет присвоено значениеB
. Таким образом, вы можете создать список столбцов и список значений. Затем выполните одно назначение.
Ответ №1:
значение столбца excluded_destination должно быть FALSE, иначе TRUE
Не уверен, что вы имели в виду identifier_exists
или excluded_destination
, потому что ваш код, похоже, предполагает первое.
Если вы хотите identifier_exists
изменить на основе значения GTIN
, вы можете просто сделать:
df['identifier_exists'] = df['GTIN'] == ""
Пример:
df1 = pd.DataFrame(data=[
[2, 3, ""],
[2, 3, "hello"],
[1, 5, ""]
], columns=['Test1', 'Test2', 'Test3'])
Test1 Test2 Test3
0 2 3
1 2 3 hello
2 1 5
df1['hello'] = df1['Test3'] == ""
Test1 Test2 Test3 hello
0 2 3 True
1 2 3 hello False
2 1 5 True
Это можно сделать после вашего последнего оператора insert (до df.columns
).
В вашем коде df.insert(...)
вставляется весь столбец с указанным значением. Смотрите документацию.
Комментарии:
1. Кажется, это меняет их все на True или False, но я хочу, чтобы это было по строкам, поэтому, если столбец GTIN строки 1 пуст, то к нему добавляется столбец identifier_exists False, и если в следующей строке есть данные в столбце gtin, я хочу, чтобы к identifier_exists было добавлено TRUE .
2. Похоже, что использование
df.insert
не помогает вашему варианту использования. Отредактировал мой ответ.3. Df.insert используются для поддержания определенного порядка, в котором должен находиться файл. Я извлекаю только определенные столбцы из файла экспорта, но в новом файле должны быть все эти дополнительные столбцы, поэтому использование вставки позволяет мне устанавливать их в нужном мне порядке. Я попробовал df[‘identifier_exists’] = df [‘GTIN’] == «» но он просто пометил все ячейки подстолбец identifier_exists имеет значение false, если строка содержит данные в ячейке gtin, то ячейка idetifier должна быть помечена как TRUE, если нет данных, она должна получить false, это нужно делать строка за строкой,
4. Это странно; использование
df['identifier_exists'] = df['GTIN'] == ""
должно работать; см. Пример. Можете ли вы проверить, действительно ли в столбце есть непустые / пустые строкиidentifier_exists
?5. В вашем примере я бы на самом деле пытался перевернуть результаты столбцов hello.. Первая строка должна быть False, потому что фактический вопрос заключается в том, содержит ли столбец GTIN данные, если да, то TRUE, если нет, то FALSE также мне нужна версия TRUE и FALSE со всеми заглавными буквами в любом случае код, который вы пробовали, все равно возвращает все false для каждой строки в столбце, я проверил столбец GTIN и тамдолжно быть много ячеек с данными и без данных в GTIN, поэтому результаты в столбце identifier_exists должны отражать это. Ячейки без GTIN пусты, но это то же самое, что быть = «?
Ответ №2:
Я думаю, это то, что вы пытаетесь сделать. Обратите внимание, что для этого вам не нужен оператор if else. Само условие является частью инструкции.
df.loc[(df['GTIN'] == ' '), 'identifier_exists'] = True
df.loc[~(df['GTIN'] == ' '), 'identifier_exists'] = False
Он проверяет, есть ли df['GTIN']
пробел. Если да, то новому столбцу 'identifier_exists'
будет присвоено значение True
Тильда ~
отрицательно влияет на это.
Если вы не переопределяли порядок столбцов позже и хотите сохранить положение столбца, вы можете указать это утверждение перед двумя приведенными выше утверждениями.
df.insert(31, 'identifier_exists', '')
Кроме того, поскольку вы переопределяете порядок столбцов позже в коде df.columns = [......
, вы можете выполнить простое назначение.
df['expiration_date'] = '2020-12-24'
df['additional_image_link'] = ' '
df['condition'] = 'new'
df['shipping_weight'] = '0.0000 lb'
и т.д…
Комментарии:
1. Я получаю эту ошибку с помощью этого кода: raise AttributeError(«Можно использовать только .str accessor со строковыми значениями!») Ошибка атрибута: можно использовать только .str accessor со строковыми значениями! Я пытаюсь изменить эту строку в моей строке, поэтому, если строка 1 gtin пуста, столбец идентификатора получает значение false, а если в нем есть gtin, столбец идентификатора получает значение true
2. можете ли вы поделиться содержимым
df['GTIN']
. Возможно, в нем больше одного пробела. Вы уверены, что в нем есть пробел, а нет''
? Чтобы получить содержимоеGTIN
, вы можете указатьdf['GTIN'].to_list()
3. я проверяю наличие пустой ячейки, поэтому, если эта ячейка строк gtin столбцов пуста (нет данных), то в ячейку столбца идентификатора записывается значение FALSE
4. Обратите внимание, что значение
''
не совпадает с Null .