python-3.x - 基于条件的子字符串提取子字符串新列,理想情况下使用 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 系列之外,没有错误消息,因为它的大小不同。
解决方案
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
推荐阅读
- python - Python 的 Decimal 类是可变宽度吗?
- postman - 是否有解决方法来确保共享工作区中的集合未存档在 Postman Free Team 帐户中?
- salesforce - 删除联系人时显示最终异常
- php - 获取树枝数组中数组的值
- java - 在 Spring Thymeleaf Java 项目中使用 AJAX 调用时发生错误 com.fasterxml.jackson.databind
- ampl - 在 AMPL 中,如何引用部分结果,并在多个地方使用它们
- docker - 拉 nanoserver:1903 时,“清单列表条目中没有匹配的清单”
- outlook-web-addins - 在应用商店上传清单文件时出现“remoteurl”错误
- javascript - 从节点js中的缓冲区检测文件类型?
- javascript - 解释在 Javascript ES6 中调用对象方法的函数中“this”的使用