【发布时间】:2021-05-29 19:17:09
【问题描述】:
请参考以下可运行的演示代码。它正在尝试将sr.str.extract() "a" 列插入多个列,并将这些列插入到 "a" 列之后的原始 df 立即。
请以更好的方式将以下代码中的步骤[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 |
+----+-----+---------------+----------------+-----+-----+
"""
【问题讨论】:
-
我希望
inplace操作看起来像:df.str.extract(col='a', rex, inplace=True),它将默认插入位置在 col'a'之后。 -
查看我编辑的解决方案,下面有 2 个选项。
-
请注意,
inplace解决方案通常被认为是一种不好的做法,并且很有可能在未来的 Pandas 版本中被贬值。见this post 和this article