在提取列之后立即将 df[col].str.extract() 结果插入原始 Pandas df 的熊猫方式

埃留

请参考以下可运行的演示代码。它试图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 |
+----+-----+---------------+----------------+-----+-----+
"""
海豆

有两种可能的解决方案:

解决方案1:

此解决方案最类似于您的理想解决方案,同时建议您对提取的列的命名进行一些轻微(但建设性的)更改。例如,而不是firstlettersecondletter,列的提取a,我们用前缀命名a_a_firstlettera_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

解决方案2:

此解决方案您可以继续使用firstlettersecondletter作为提取的列名。

您可以通过.iloc以下方式将列分成两部分df_left从第一列到列的左侧部分adf_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将Pandas.Series.str.extractall()结果分配回原始数据集?(TypeError:插入的列的索引与框架索引不兼容)

在 pandas df 列上使用 str.extract 和正则表达式

熊猫用df.apply结果替换原始列空值

以整洁的方式使用str_extract_all的新列

Pandas df中日期列的结果未知

Pandas:反转 df.applymap(str) 的效果以正确呈现 pivot_table 结果

使用df.column.str。包含并更新pandas数据框列

使用str中的常量值在pandas df中添加日期列

使用 str.contains 创建新列 Pandas df 给出:值的长度与索引的长度不匹配

从熊猫DataFrame的背面开始str.extract

Pandas Series str.split将拆分结果作为单独的列分配回原始数据框

熊猫:通过汇总不同df的列来创建新df的Python方式

重命名熊猫列的编程方式,插入'_'

从DF列将值插入字典-Pandas(Python)

将str分数转换为pandas df中的浮动

从CSV加载str.get_dummies()熊猫df的问题

在df列中的str上使用str.join

熊猫:将列从另一个df插入到某个位置的新df

从多个列中提取Python Pandas str。

pandas df.loc保持原始df的顺序

Python Pandas .str.extract 方法在索引时失败

Python pandas str.extract regex 字符串结尾

带有额外逻辑的熊猫str.extract(lambda?)

Pandas DF 列数据拆分

在pandas DF中选择列

在pandas df列中过滤

使用熊猫的Groupby DF列

Python Pandas 插入 DF 不起作用

将pandas df插入sqlite3会插入运行文本,而不是列