我有一个包含数百个条目的数据集(Excel)。在一个字符串列中,包含大多数信息。信息除以“ _”,然后由人类输入。因此,不可能使用索引位置。
要创建可用的数据基础,必须从另一列的此列中提取信息。
仅搜索模式=' * v * '是不够的。但是结合第一项必须为数字的条件,它可以工作。
我试图使其与迭代,迭代项,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系列。
答案 0 :(得分:0)
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
答案 1 :(得分:0)
您说它在36个值之后停止吗?您说这是您正在处理的Excel文件吗?您可以尝试做的一件事是将数据集保存到.csv文件,然后尝试使用pd.read_csv函数读取该文件。有时Excel文件中还有一些不容易看到的额外字符。