我正在尝试构建一个数据帧,以清理数据库中的数据。数据未正确归一化(超出我的控制),并且有错误。
典型的数据行如下所示: ['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是否在主代码中构建?
答案 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分钟才能运行。这需要眨眼!