Добавьте значение из одной строки в другую, если строки имеют соответствующие подстроки в кадре данных Pandas - PullRequest
0 голосов
/ 23 мая 2019

Я работаю с фреймами данных в пандах на примере распространителя книг.

Хранилище создает файлы .csv, которые обрабатывают подписанные и неподписанные (автором) копии книг с одинаковыми названиями как разные.строки, например:

TITLE      //                      STOCK

A song of ice and fire     //       5

A song of ice and fire (signed)  //  1

Однако я хочу, чтобы каждый заголовок был отдельной строкой, но с дополнительным столбцом для подписанного запаса, например:

TITLE            //                STOCK  //   SIGNED STOCK

A song of ice and fire      //       5       //     1

Я успешно прочиталв CSV к фрейму данных pandas и добавил пустой столбец с именем SIGNED STOCK, дополненный нулями.Я также очистил код и избавился от пробелов и NaN s. Однако я не знаю, как искать в строках заголовки с подстрокой (signed), а затем добавлять запас в соответствующий SIGNED STOCKстолбец соответствующего названия.Любая помощь высоко ценится!:)

IBS_combined = pd.read_csv("IBS_21_05_19.csv",usecols=[3,12,21],encoding='latin-1')

IBS_combined.columns= ['Product', 'ISBN','Stock']

IBS_combined['Signed Stock']='0'

IBS_combined.replace(['Product'], np.nan, inplace=True)

IBS_combined.dropna(subset=['Product'], inplace=True)

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вы можете разбить информационный фрейм на два df со строками, имеющими подпись, только без знака, и затем объединить результат. Ниже приведен пример (Предполагается, ISBN является уникальным ключом для идентификации книги, и в одной и той же книге не должно быть более 1 записи для подписанных или неподписанных акций):

  1. Настройка данных примера, которые содержат номера ISBN с:

    • 1 подписанных и 1 неподписанных записей
    • 1 подписанная запись только для акций
    • 1 запись без знака только для акций

      str="""ISBN // TITLE // STOCK
      1 // A song of ice and fire // 5
      1 // A song of ice and fire (signed) // 1
      2 // another book // 10
      2 // another book (signed) // 2
      3 // 2nd book // 3
      4 // 3rd book (signed) // 1"""
      
      df = pd.read_csv(pd.io.common.StringIO(str), sep=' // ', engine='python')
      
  2. разделить фрейм данных на два фрейма на основе маски ниже m:

    • df_signed: df[m]
    • df_unsigned: df[~m]

      m = df.TITLE.str.contains('\(signed\)')
      
  3. формат df_signed (установите ISBN в качестве индекса, переименуйте столбец и удалите подстроку (со знаком) из столбца TITLE):

    df_signed = df[m].set_index('ISBN')\
                     .rename(columns={'STOCK':'SIGNED_STOCK'}) \
                     .replace('\s*\(signed\)', '', regex=True)
    print(df_signed)
    #                       TITLE  SIGNED_STOCK
    #ISBN
    #1     A song of ice and fire             1
    #2               another book             2
    #4                   3rd book             1
    
  4. настройте df_unsigned и используйте DataFrame.combine_first () , чтобы присоединиться к df_signed

    df_new = df[~m].set_index('ISBN') \
                   .combine_first(df_signed) \
                   .fillna(0, downcast='infer') \
                   .reset_index() 
    print(df_new)
    #   ISBN  SIGNED_STOCK  STOCK                   TITLE
    #0     1             1      5  A song of ice and fire
    #1     2             2     10            another book
    #2     3             0      3                2nd book
    #3     4             1      0                3rd book
    
  5. изменить порядок столбцов:

    cols = ['TITLE', 'ISBN', 'STOCK', 'SIGNED_STOCK']
    df_new = df_new[cols]
    
0 голосов
/ 23 мая 2019

Вы можете сделать что-то вроде:

signed = []
for row in IBS_combined.iterrows():
    if row['TITLE'].find(your_string) != -1:
        signed.append(row['TITLE'].replace(your_string,''))

Затем вы можете просмотреть подписанные и добавить суммы

for item in signed:
    IBS_combined[IBS_combined['TITLE']==item]['SIGNED'] = IBS_combined[IBS_combined['TITLE']==item]['SIGNED'] +1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...