删除短语和括号并对数据框进行排序

时间:2019-11-03 18:03:55

标签: python pandas data-cleaning

给出一个示例数据帧:

df = 

                               multi
0 MULTIPOLYGON(((1.1 1.2, 2.1 2.2)))
1 MULTIPOLYGON(((3.1 3.2, 4.1 4.2)))
2 MULTIPOLYGON(((5.1 5.2, 6.1 6.1)))

Disred输出:

df = 

 a_1 b_1 a_2 b_2 a_3 b_3
 1.1 1.2 3.1 3.2 5.1 5.2
 2.1 2.2 4.1 4.2 6.1 6.2

我做了很长的过程,即使放在这里也很糟糕。

  1. 第一步:

先删除MULTIPOLYGON,然后依次删除((()))

  1. 第二步:

以逗号分隔

  1. 第三步:

转置然后在空间上分割

我确信应该有更好,更明智的方法(在excel上很容易做到,但是我需要使用python)

1 个答案:

答案 0 :(得分:1)

使用str.extractstr.splittransformpd.concat

我们可以分多个步骤进行操作

  1. 首先,我们提取((( ... )))之间的数字
  2. 然后我们将,transform的行拆分为列
  3. 我们在空格上将两个数字分开,并concat并排新建数据
temp = df['multi'].str.extract('\(\(\((.*)\)\)\)')[0].str.split(',', expand=True).T

df_new = pd.concat(
    [temp[col].str.strip().str.split(' ', expand=True)\
     .rename(columns={0:f'a_{n+1}', 1:f'b_{n+1}'}) 
     for n, col in enumerate(temp.columns)], axis=1
)

输出

   a_1  b_1  a_2  b_2  a_3  b_3
0  1.1  1.2  3.1  3.2  5.1  5.2
1  2.1  2.2  4.1  4.2  6.1  6.2

更多说明:

list comprehension看起来很复杂,因此写成普通的for loop,它是:

newdata = []
for n, col in enumerate(temp.columns):
    dftemp = temp[col].str.strip().str.split(' ', expand=True)
    dftemp = dftemp.rename(columns={0:f'a_{n+1}', 1:f'b_{n+1}'}) 

    newdata.append(dftemp)

newdf = pd.concat(newdata, axis=1)