Я обновляю столбец на основе подстроки в другом столбце.Это было сделано путем итерации по строкам.
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
Чтобы помочь моему обучению, я хотел бы сделать то же самое, но использоватьприменить метод с помощью лямбда-функции, т.е. обновить третий столбец 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 я преобразовываю проанализированное значение функции в строку?Что здесь происходит под капотом?