Python:Pandas:是否有更快的方法来构建此数据框?

时间:2018-08-02 07:08:28

标签: python performance pandas apply

我正在尝试构建一个数据帧,以清理数据库中的数据。数据未正确归一化(超出我的控制),并且有错误。

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

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

我使用apply函数构建数据框,但该表有54,000多行,因此运行大约需要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)

---主要代码

ExpandedAntCols = ['Atoll_cell', 'height', 'bearing','  make', 'model', 'freq', 'tilt']

dfExpandedAnt = pd.DataFrame(columns = ExpandedAntCols)
dfAtollTxers = dfAtollTxers.apply(makeExpandedAntTable, axis = 1)

使用for循环建立列表,然后最后将其转换为df会更快吗?还是只是在helper函数中构建列表,而df是否在主代码中构建?

2 个答案:

答案 0 :(得分:1)

使用str.split并将其添加为新列:

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是否在主代码中构建?

答案几乎总是与DataFrames一起使用,并避免for循环

答案 1 :(得分:0)

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

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分钟才能运行。这需要眨眼!