首页 > 解决方案 > 基于条件的子字符串提取子字符串新列,理想情况下使用 Pandas

问题描述

我得到了一个包含数百个条目的数据集(Excel)。在一个字符串列中有大部分信息。信息以“_”划分并由人工输入。因此,无法使用索引位置。

要创建可用的数据基础,必须从另一列中的该列中提取信息。

仅搜索模式 = ' *v* ' 是不够的。但结合第一项必须是数字的条件,它可以工作。

我试图让它与 iterrows、iteritems、str.strip、str.extract 等一起工作。但我收到的最佳解决方案是使用 for 循环。

     pattern = '_*v*_'
    test = []


    for i in df['col']:
'#Split the string in substrings
        i = i.split('_')
        for c in i:
            if c.find('x') == 1:
                if c[0].isdigit():
                   # print(c)
                    test.append(c)
                else:
'#To be able to fix a few rows manually
                    test.append(0)
[4]: test =[22v3, 33v55, 4v2]



#Input

+-----------+-----------+
|    col    | targetcol |
+-----------+-----------+
| as_22v3   |           |
| 33v55_bdd |           |
| Ave_4v2   |           |
+-----------+-----------+

#Output

+-----------+-----------+--+
|    col    | targetcol |  |
+-----------+-----------+--+
| as_22v3   | 22v3      |  |
| 33v55_bdd | 33v55     |  |
| Ave_4v2   | 4v2       |  |
+-----------+-----------+--+

我的代码确实有效,但仅适用于前几行。它在 36 个值后停止,我不知道为什么。除了不能将列表分配给 DataFrame 系列之外,没有错误消息,因为它的大小不同。

标签: python-3.xpandasfor-loop

解决方案


pandas.Series.str.extract应该有帮助:

>>> df['col'].str.extract(r'(\d+v+\d+)')
       0
0   22v3
1  33v55
2    4v2
df = pd.DataFrame({
    'col': ['as_22v3', '33v55_bdd', 'Ave_4v2']
})
df['targetcol'] = df['col'].str.extract(r'(\d+v+\d+)')

编辑

df = pd.DataFrame({
    'col': ['as_22v3', '33v55_bdd', 'Ave_4v2', '_22 v3', 'space 2,2v3', '2.v3',
    '2.111v999', 'asd.123v77', '1    v7', '123 v 8135']
})

pattern = r'(\d+(\,[0-9]+)?(\s+)?v\d+)'

df['result'] = df['col'].str.extract(pattern)[0]
           col   result
0      as_22v3     22v3
1    33v55_bdd    33v55
2      Ave_4v2      4v2
3       _22 v3    22 v3
4  space 2,2v3    2,2v3
5         2.v3      NaN
6    2.111v999  111v999
7   asd.123v77   123v77
8      1    v7  1    v7
9   123 v 8135      NaN

推荐阅读