请参考以下可运行的演示代码。它试图sr.str.extract()
将"a"
列分成多列,并在列之后立即将这些列插入到原始 df 中"a"
。
请以更好的方式结合步骤[1]
和[2]
以下代码。
import re
import pandas as pd
df = pd.DataFrame({
"a" : {1: 'a', 2: 'aa', 3: 'aaa'} ,
"b" : {1: 'b', 2: 'bb', 3: 'bbb'} ,
"c" : {1: 'b', 2: 'bb', 3: 'bbb'} ,
})
"""
df==
+----+-----+-----+-----+
| | a | b | c |
|----+-----+-----+-----|
| 1 | a | b | b |
| 2 | aa | bb | bb |
| 3 | aaa | bbb | bbb |
+----+-----+-----+-----+
"""
# step [1] sr.str.extract
rex = re.compile(r'(?P<firstletter>\w) (?P<secondletter>\w+)', re.X)
cols = df['a'].str.extract(rex)
# step [2] insert extracted columns back into the original df
df['firstletter'], df['secondletter'] = 0, 0
df['firstletter'] = cols['firstletter']
df['secondletter'] = cols['secondletter']
df = df['a firstletter secondletter b c'.split()]
"""
# Or, a more concise step [2], but too hard to glance thru and remember, also prone to mistake:
for col in cols.columns[::-1]:
df.insert(df.columns.get_loc('a')+1, col, cols[col])
"""
# result:
"""
df==
+----+-----+---------------+----------------+-----+-----+
| | a | firstletter | secondletter | b | c |
|----+-----+---------------+----------------+-----+-----|
| 1 | a | nan | nan | b | b |
| 2 | aa | a | a | bb | bb |
| 3 | aaa | a | aa | bbb | bbb |
+----+-----+---------------+----------------+-----+-----+
"""
有两种可能的解决方案:
此解决方案最类似于您的理想解决方案,同时建议您对提取的列的命名进行一些轻微(但建设性的)更改。例如,而不是firstletter
和secondletter
,列的提取a
,我们用前缀命名a_
为a_firstletter
和a_secondletter
。然后我们可以使用如下语句:
import re
df = df.assign(**df['a'].str.extract(r'(?P<a_firstletter>\w) (?P<a_secondletter>\w+)', re.X)).sort_index(axis=1)
结果:
print(df)
a a_firstletter a_secondletter b c
1 a NaN NaN b b
2 aa a a bb bb
3 aaa a aa bbb bbb
此解决方案您可以继续使用firstletter
和secondletter
作为提取的列名。
您可以通过.iloc
以下方式将列分成两部分:df_left
从第一列到列的左侧部分a
和df_right
从列后的列a
到最后的右侧部分。然后将左侧部分df_left
、新提取的列cols
和右侧部分df_right
沿列连接在一起pd.concat()
,如下所示:
df_left = df.iloc[:, 0: df.columns.get_loc('a')+1]
df_right = df.iloc[:, df.columns.get_loc('a')+1:]
df = pd.concat([df_left, cols, df_right], axis=1)
结果:
print(df)
a firstletter secondletter b c
1 a NaN NaN b b
2 aa a a bb bb
3 aaa a aa bbb bbb
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句