Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 拆分字符串没有带限制字段名和内容的分隔符_Python_Pandas_Split - Fatal编程技术网

Python 拆分字符串没有带限制字段名和内容的分隔符

Python 拆分字符串没有带限制字段名和内容的分隔符,python,pandas,split,Python,Pandas,Split,我有一个带有数据框的数据框。 dataframe包含一个描述列。此列中有限制性字段名及其内容。 它看起来像: AAm.loc[0, ’OmsBank'] => ‘ fieldname1: content fn1 fieldname3: content fn3 ‘ AAm.loc[1, ’OmsBank'] => ‘ fieldname5: content fn5 fieldname2: content fn2 ‘ 我在谷歌上搜索了很多关于这个问题的解决方

我有一个带有数据框的数据框。
dataframe包含一个描述列。此列中有限制性字段名及其内容。 它看起来像:

AAm.loc[0, ’OmsBank'] => ‘  fieldname1: content fn1   fieldname3: content fn3     ‘
AAm.loc[1, ’OmsBank'] => ‘  fieldname5: content fn5   fieldname2: content fn2     ‘
我在谷歌上搜索了很多关于这个问题的解决方案(在字段名和内容中分解一个长字符串)。到目前为止,还没有找到简单的解决办法

我可以使用双空格作为分隔符进行拆分,但在内容字段中也有双空格。所以这不是一个vallid选项。尝试将拆分与列表/数组一起使用,但也没有成功

到目前为止,我已经创建了一个小的第二个数据帧,其中包含限制性字段名、字段名的起始位置、内容的起始位置和内容的结束位置

我循环浏览银行对账单的行,检查存在哪些字段名,并将开始标签和开始内容的位置存储在小数据框中 我通过字段名的位置对小数据帧进行排序,重置索引,然后我可以确定内容的结束位置(下一个字段名的开始)。 最后一个字段名没有下一个字段名。因此,我必须将描述字符串的长度存储为结束值。 然后我可以在bankstatement数据框中存储特定元素的内容

我觉得它可以做得更加“pythonic”和高效、向量化、lambda功能?
如果有人提出建议,我将不胜感激。一般来说,这个问题的解决方案也可以帮助其他人

我的代码到现在为止:

import pandas as pd
# data
tosplit = ['SEPA Inc dl Incassant: blabla  Naam: Insurance    Machtiging: number  Omschrijving: Rel.nr. number2    IBAN: iban#', 
          'SEPA Overboeking  IBAN: iban#  BIC: bic#  Naam: blabla  Omschrijving: Refund  Kenmerk: refcode', 
          'SEPA iDEAL  IBAN: iban#  BIC: bic#  Naam: seller  Omschrijving: description  double space  Kenmerk: refcode',
          'SEPA iDEAL  IBAN: iban#  BIC: bic#  Naam: city  Omschrijving: citytax']
AAm = pd.DataFrame(tosplit, columns= ['OmsBank'])
AAm['Naam'] = ''
AAm['Oms'] = ''
AAm
# field list
fld = [' IBAN: ', ' BIC: ', ' Naam: ', ' Omschrijving: ', ' Kenmerk: ', ' Referentie: ', ' Machtiging: ', ' Incassant: ']
fld.sort()

# store field list in dataframe and add columns for position
fld= pd.DataFrame(fld, columns = ['fldnm'] )
ser= [0]*len(fld)
fld = fld.assign(bgn = ser, bgc = ser, end = ser )
# loop through AAm (dataframe with bankmutations) and proces data
for i in AAm.index:

    # search for fieldnames and store postion (begin of fieldname and begin of fieldcontent) if the are found
    for j in fld.index:
        temp = AAm.loc[i, 'OmsBank'].find(fld.loc[j,'fldnm'])
        if temp == -1: 
            temp2 = -1 
        else:
            temp2 = temp+len(fld.loc[j,'fldnm'])
            fld.loc[j,'bgn'] = temp
            fld.loc[j,'bgc'] = temp2

    # order by postion and reset index
    fld = fld.sort_values(by ='bgc')
    fld.reset_index(drop=True, inplace = True)
    # establish end of content position. For the last one it is length general string
    for j in fld.index:
        if (fld.loc[j, 'bgn']>0) & (j < len(fld)-1):
            fld.loc[j, 'end'] = fld.loc[(j+1), 'bgn']
        fld.loc[len(fld)-1, 'end'] = len(AAm.loc[i, 'OmsBank'])

    # store start/end of relevant field content in AAm
    nm_om = fld[(fld['fldnm'] == ' Naam: ') | (fld['fldnm'] == ' Omschrijving: ')]
    nm_om.reset_index(drop=True, inplace = True)
    AAm.loc[i,'Naam'] = AAm.loc[i,'OmsBank'][nm_om.loc[0, 'bgc']:nm_om.loc[0, 'end']].strip()
    AAm.loc[i,'Oms'] = AAm.loc[i,'OmsBank'][nm_om.loc[1, 'bgc']:nm_om.loc[1, 'end']].strip()

    #reset values in fieldlist
    fld[['bgn', 'bgc', 'end']]=0
将熊猫作为pd导入
#资料
tosplit=['SEPA Inc dl Incassant:blabla Naam:保险加工:编号OMSChrijing:Rel.nr.编号2 IBAN:IBAN#',
“SEPA超额预订IBAN:IBAN#BIC:BIC#Naam:blabla Omschrijing:退款Kenmerk:refcode”,
“SEPA理想IBAN:IBAN#BIC:BIC#Naam:卖方OMSChrijing:说明双空格Kenmerk:refcode”,
“SEPA理想IBAN:IBAN#BIC:BIC#Naam:city Omschrijing:city Tax”]
AAm=pd.DataFrame(tosplit,columns=['OmsBank'])
AAm['Naam']='
AAm['Oms']='
空空导弹
#字段列表
fld=['IBAN:'、'BIC:'、'Naam:'、'Omschrijving:'、'Kenmerk:'、'Referentie:'、'Machtiging:'、'Incassant:']
fld.sort()
#在dataframe中存储字段列表并为位置添加列
fld=pd.DataFrame(fld,列=['fldnm'])
ser=[0]*len(fld)
fld=fld.assign(bgn=ser,bgc=ser,end=ser)
#循环通过AAm(带BANKROUTIONS的数据帧)并处理数据
对于AAm.index中的i:
#如果找到,则搜索字段名和存储位置(字段名的开头和字段内容的开头)
对于fld索引中的j:
temp=AAm.loc[i,'OmsBank']查找(fld.loc[j,'fldnm'])
如果温度==-1:
temp2=-1
其他:
temp2=温度+长度(fld.loc[j,'fldnm'])
法兰位置[j,'bgn']=温度
fld.loc[j,'bgc']=temp2
#按职位和重置索引排序
fld=fld.sort_值(按='bgc')
fld.重置索引(drop=True,inplace=True)
#建立内容结束位置。最后一个是长度一般字符串
对于fld索引中的j:
如果(fld.loc[j,'bgn']>0)和(j
解决(更复杂的)问题的最佳实践是提供所谓的“可复制”场景,人们可以在IDE中复制和粘贴您的dataframe+代码,并遇到相同的问题。对于您来说,这意味着包含一个带有
pd.DataFrame
的数据集,这样人们就可以立即以正确的格式获取数据,因为这对您的问题非常重要。例如,请看我的@Erfan:这是一个相当大的集合。我的代码可以工作,但我认为它远远不是最佳的。我将尝试添加一个小数据框,使其可复制是的,我们的想法是将问题分解为一个小示例数据集,而不是包含整个数据集。我也会把你的问题分解成小部分,现在你发布了你的全部代码,这会吓跑大多数人,因为他们不想通过80行代码进行调试。你给出了2行的描述。生成数据帧提取的一种简单方法是
df.iloc[:10]。to_dict(orient='list')
:它给出前10行的可复制内容(根据相关内容调整片段)