Добавление значений в существующие столбцы в пандах - PullRequest
0 голосов
/ 27 апреля 2018

Я зацикливаюсь на csv-файлах в каталоге и читаю их с помощью панд. Для каждого файла CSV у меня есть категория и торговая площадка. Затем мне нужно получить идентификатор категории и идентификатор рынка из базы данных, которая будет действительна для этого CSV-файла.

finalDf - это фрейм данных, содержащий все продукты для всех файлов csv, и мне нужно добавить его с данными из текущего csv.

Список продуктов текущего CSV получен с использованием:

df['PRODUCT']

Мне нужно добавить их в finalDf, и я использовал:

finalDf['PRODUCT'] =  finalDf['PRODUCT'].append(df['PRODUCT'],ignore_index=True)

Кажется, это работает нормально, и теперь мне нужно вставить catid и marketid в соответствующие столбцы finalDf. поскольку catid и marketid являются согласованными в текущем файле csv, мне просто нужно добавить их столько раз, сколько строк в кадре данных df, это то, что я пытаюсь выполнить в приведенном ниже коде.

finalDf = pd.DataFrame(columns=['PRODUCT', 'CAT_ID', 'MARKET_ID'])
finalDf['PRODUCT'] = finalDf.PRODUCT.astype('category')

df = pd.read_csv(filename, header=None,
                             names=['PRODUCT', 'URL_PRODUCT', 'RANK', 'URL_IMAGE', 'STARS', 'PRICE', 'NAME', 'SNAPDATE',
                                    'CATEGORY', 'MARKETPLACE', 'PARENTCAT', 'LISTTYPE', 'VERSION', 'LEVEL'], sep='\t')

finalDf['PRODUCT'] = finalDf['PRODUCT'].append(df['PRODUCT'],ignore_index=True)
# Here I have a single value to add n times, n corresponding to the number of rows in the dataframe df
catid = 2113
marketid = 13
catids = pd.Series([catid]*len(df.index))
marketids = pd.Series([marketid]*len(df.index))
finalDf['CAT_ID'] = finalDf['CAT_ID'].append(catids, ignore_index=True)
finalDf['MARKET_ID'] = finalDf['MARKET_ID'].append(marketids, ignore_index=True)

print finalDf.head()

        PRODUCT  CAT_ID  MARKET_ID
    0    ABC       NaN    NaN
    1    ABB       NaN    NaN
    2    ABE       NaN    NaN
    3    DCB       NaN    NaN
    4    EFT       NaN    NaN

Как видите, у меня просто есть значения NaN вместо фактических значений. ожидаемый результат:

        PRODUCT  CAT_ID  MARKET_ID
    0    ABC       2113    13
    1    ABB       2113    13
    2    ABE       2113    13
    3    DCB       2113    13
    4    EFT       2113    13

finalDF, содержащий несколько CSV, будет выглядеть так:

        PRODUCT  CAT_ID  MARKET_ID
    0    ABC       2113    13
    1    ABB       2113    13
    2    ABE       2113    13
    3    DCB       2113    13
    4    EFT       2113    13
    5    SDD       2114    13
    6    ERT       2114    13
    7    GHJ       2114    13
    8    MOD       2114    13
    9    GTR       2114    13
   10    WLY       2114    13
   11    WLO       2115    13
   12    KOP       2115    13

Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я наконец нашел решение, не знаю, почему другой не сработал. Но этот проще:

tempDf = pd.DataFrame(columns=['PRODUCT','CAT_ID','MARKET_ID'])
tempDf['PRODUCT'] = df['PRODUCT']
tempDf['CAT_ID'] = catid
tempDf['MARKET_ID'] = 13

finalDf = pd.concat([finalDf,tempDf])
0 голосов
/ 27 апреля 2018

Вам на самом деле не нужны катидоны и маркетиды:

finalDf['CAT_ID'] = catid
finalDf['MARKET_ID'] = marketid

Будет работать.

Для остальной части сценария я бы, наверное, немного упростил ситуацию:

finalDf = pd.DataFrame()
finalDf['PRODUCT'] = df['PRODUCT'].reset_index()

Предположим, что вас не интересует исходный индекс df, как подразумевает ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...