Python:Pandas:有没有更快的方法来构建这个数据帧?

Python:Pandas:有没有更快的方法来构建这个数据帧?,python,performance,pandas,apply,Python,Performance,Pandas,Apply,我正在尝试构建一个数据框架来清理数据库中的数据。数据未正常化,超出了我的控制范围,存在错误 典型的数据行如下所示: ['BTENFU0',4.3,0',ARGUS DB583E-SN 750MHz EDT_0'] 但我需要它来分解最后一个字段,所以我有: ['BTENFU0',4.3,0',ARGUS','DB583E-SN','750MHz',0'] 我使用一个apply函数来构建一个数据帧,但是这个表有54000多行,所以运行大约需要20分钟 有没有更快的方法?我尝试了一些链接的想法,但我无

我正在尝试构建一个数据框架来清理数据库中的数据。数据未正常化,超出了我的控制范围,存在错误

典型的数据行如下所示: ['BTENFU0',4.3,0',ARGUS DB583E-SN 750MHz EDT_0']

但我需要它来分解最后一个字段,所以我有: ['BTENFU0',4.3,0',ARGUS','DB583E-SN','750MHz',0']

我使用一个apply函数来构建一个数据帧,但是这个表有54000多行,所以运行大约需要20分钟

有没有更快的方法?我尝试了一些链接的想法,但我无法正常工作。这也很复杂,因为我必须检查数据布局中的特定错误

代码如下:

def makeExpandedAntTable(df): # - df is a series apparently
    if df.loc['antName'] == 'COMMSCOPE NT-360M-F_2600MHZ EDT_0':
        df.loc['antName'] = 'COMMSCOPE NT-360M-F 2600MHZ EDT_0'
    newlist = df.values.tolist()
    print(newlist[0])

    ant = newlist[3].split()
    if ant[3] == 'EDT_02_5':
        ant[3] = 'EDT_02.5'
    ant.extend(ant[3].split("_"))
    newRow = newlist[:3]
    newRow.extend(ant)
    del newRow[6:8]
    if len(newRow) == 7:
        dfExpandedAnt.loc[len(dfExpandedAnt)] = newRow
    else:
        print('error: missing field in ' + newRow)
--主代码 使用for循环建立一个列表,然后在最后将其转换为df会更快吗?或者只需在helper函数中构建列表,并在主代码中进行df构建?

使用并将其添加为新列:

df = pd.DataFrame(data=[['BTENFU0', 4.3, 0, 'ARGUS DB583E-SN 750MHz EDT_0'],
                        ['BTENFU0', 4.3, 0, 'ARGUS DB583E-SN 750MHz EDT_0']], 
                        columns=['Atoll_cell', 'height', 'bearing','messed_up_column'])
df[['make', 'model', 'freq', 'tilt']] = pd.DataFrame(df.messed_up_column.str.split().tolist())
df.drop(columns='messed_up_column', inplace=True)
print(df.to_string())
输出df:

  Atoll_cell  height  bearing   make      model    freq   tilt
0    BTENFU0     4.3        0  ARGUS  DB583E-SN  750MHz  EDT_0
1    BTENFU0     4.3        0  ARGUS  DB583E-SN  750MHz  EDT_0
注意:对于倾斜,您可以执行以下操作:

df.tilt = df.tilt.str.replace('EDT_','').str.replace('_','.').astype(float)
使用for循环建立一个列表,然后在最后将其转换为df会更快吗?或者只是在helper函数中构建列表,然后在主代码中构建df


这个问题的答案几乎总是使用数据帧并避免for循环

我也想出了一个答案,在发布答案之前删除它的人给了我线索。我在上面的新答案之前写了这个。我会看一看,看看我现在是否可以简化下面的内容

splitted = dfAtollTxers['antName'].str.split(expand=True)
dfWorking = pd.concat([dfAtollTxers, splitted], axis=1)
splitted2 = dfWorking[3].str.split("_",expand=True)
splitted2.drop([0],inplace = True, axis = 1)
splitted2.rename(columns = {1:'tilt'},inplace = True)
dfExpandedAnt = pd.concat([dfWorking, splitted2], axis=1)
dfExpandedAnt.drop([3],inplace = True, axis = 1)
dfExpandedAnt.drop([4],inplace = True, axis = 1)
dfExpandedAnt.drop(['antName'],inplace = True, axis = 1)
dfExpandedAnt.rename(columns = {0:'make',1:'model',2:'freq'},inplace = True)

我不喜欢这样节省的疯狂时间。我的旧方法运行了20多分钟。这需要眨眼

感谢@cosmic_的询问!我将使用你的代码来简化我的代码
splitted = dfAtollTxers['antName'].str.split(expand=True)
dfWorking = pd.concat([dfAtollTxers, splitted], axis=1)
splitted2 = dfWorking[3].str.split("_",expand=True)
splitted2.drop([0],inplace = True, axis = 1)
splitted2.rename(columns = {1:'tilt'},inplace = True)
dfExpandedAnt = pd.concat([dfWorking, splitted2], axis=1)
dfExpandedAnt.drop([3],inplace = True, axis = 1)
dfExpandedAnt.drop([4],inplace = True, axis = 1)
dfExpandedAnt.drop(['antName'],inplace = True, axis = 1)
dfExpandedAnt.rename(columns = {0:'make',1:'model',2:'freq'},inplace = True)