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)))
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
我做了很长的过程,即使放在这里也很糟糕。
先删除MULTIPOLYGON
,然后依次删除(((
和)))
以逗号分隔
转置然后在空间上分割
我确信应该有更好,更明智的方法(在excel上很容易做到,但是我需要使用python)
答案 0 :(得分:1)
str.extract
,str.split
,transform
和pd.concat
:我们可以分多个步骤进行操作
((( ... )))
之间的数字,
和transform
的行拆分为列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)