TypeError: строковые индексы должны быть целыми числами при обновлении столбца dataframe с использованием .apply - PullRequest
0 голосов
/ 13 ноября 2018

Я обновляю столбец на основе подстроки в другом столбце.Это было сделано путем итерации по строкам.

import pandas as pd

my_DestSystemNote1_string =  'ISIN=XS1906311763|CUSIP=         |CalTyp=1'
dfDest = [('DestSystemNote1', ['ISIN=XS1906311763|CUSIP=         |CalTyp=1', 
                               'ISIN=XS0736418962|CUSIP=         |CalTyp=1', 
                               'ISIN=XS1533910508|CUSIP=         |CalTyp=1', 
                               'ISIN=US404280AS86|CUSIP=404280AS8|CalTyp=1', 
                               'ISIN=US404280BW89|CUSIP=404280BW8|CalTyp=21',
                               'ISIN=US06738EBC84|CUSIP=06738EBC8|CalTyp=21',
                               'ISIN=XS0736418962|CUSIP=         |CalTyp=1',]),
         ]
# create pandas df
dfDest = pd.DataFrame.from_items(dfDest)

def findnth(haystack, needle, n):
    parts= haystack.split(needle, n+1)
    if len(parts)<=n+1:
        return -1
    return len(haystack)-len(parts[-1])-len(needle)

def split_between(input_string, 
                  start_str, start_occurence, 
                  end_str, end_occurence
                 ):
    start_index = findnth(input_string, start_str, start_occurence-1) + len(start_str)
    end_index = findnth(input_string, end_str, end_occurence-1) + len(end_str) -1
    return input_string[start_index:end_index]

dfDest['FOUND_ISIN'] = ""
dfDest['FOUND_CUSIP'] = ""
dfDest.info()
for index, row in dfDest.iterrows():
    try:
        print(row.DestSystemNote1)
        row.FOUND_ISIN = split_between(row.DestSystemNote1, "ISIN=", 1, "|", 1)
        row.FOUND_CUSIP = split_between(row.DestSystemNote1, "CUSIP=", 1, "|", 2)
        # print ('DestSystemNote1=' + row.DestSystemNote1 + " " + 'FOUND_ISIN= ' + row.FOUND_ISIN)   
        # print ('DestSystemNote1=' + row.DestSystemNote1 + " " + 'FOUND_CUSIP= ' + row.FOUND_CUSIP)   
    except:
        pass # doing nothing on exception

enter image description here

Чтобы помочь моему обучению, я хотел бы сделать то же самое, но использоватьприменить метод с помощью лямбда-функции, т.е. обновить третий столбец FOUND_ISIN2, но я получаю TypeError: string indices must be integers

dfDest['FOUND_ISIN2'] = dfDest["DestSystemNote1"].apply(lambda x: split_between(x['DestSystemNote1'], "ISIN=", 1, "|", 1))

Когда я помещаю образец функции в функцию, она возвращает значение

dfDest['FOUND_ISIN2'] = dfDest["DestSystemNote1"].apply(lambda x: split_between('ISIN=XS1906311763|CUSIP= |CalTyp=1',"ISIN=", 1, "|", 1) )

Итак, помня об этом, я попытался преобразовать DestSystemNote1 в строку, но снова возникла ошибка

dfDest['FOUND_ISIN2'] = dfDest["DestSystemNote1"].apply(lambda x: split_between(x['DestSystemNote1'].astype('str'), "ISIN=", 1, "|", 1))

При использовании .apply я преобразовываю проанализированное значение функции в строку?Что здесь происходит под капотом?

1 Ответ

0 голосов
/ 13 ноября 2018

вам не нужно lambda или apply.Придерживайтесь панд, и все готово в три этапа (возможно, это можно сделать и с меньшими затратами):

# 1 - Create DataFrame
import pandas as pd
dfDest = pd.DataFrame.from_items(dfDest)

# 2 - String parsing
cols = ['ISIN','CUSIP', 'CalTyp'] # Define Columns
dfDest[cols] = dfDest['DestSystemNote1'].str.split('|', n=-1, expand=True) # Split Strings to columns

# 3 - Replace unwanted parts of raw data
for header in cols: # look at every column and remove its header string from the data
    dfDest[header] = dfDest[header].str.replace(header + "=", '') # and add "=" to pattern you want to remove

print dfDest

Вывод:

                               DestSystemNote1          ISIN      CUSIP CalTyp
0   ISIN=XS1906311763|CUSIP=         |CalTyp=1  XS1906311763                 1
1   ISIN=XS0736418962|CUSIP=         |CalTyp=1  XS0736418962                 1
2   ISIN=XS1533910508|CUSIP=         |CalTyp=1  XS1533910508                 1
3   ISIN=US404280AS86|CUSIP=404280AS8|CalTyp=1  US404280AS86  404280AS8      1
4  ISIN=US404280BW89|CUSIP=404280BW8|CalTyp=21  US404280BW89  404280BW8     21
5  ISIN=US06738EBC84|CUSIP=06738EBC8|CalTyp=21  US06738EBC84  06738EBC8     21
6   ISIN=XS0736418962|CUSIP=         |CalTyp=1  XS0736418962                 1

счастливое кодирование.

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