Добавление условия в столбец в Pandas

#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 .