我有一个包含两个列的DataFrame,第二个列的格式如下:
1 {{continuity 1.0000e+00} {x-velocity 0.0000e+00} {y-velocity 4.4010e-02} {z-velocity 9.5681e-04} {energy 1.1549e-07} }
2 {{continuity 1.0000e+00} {x-velocity 7.8788e-04} {y-velocity 1.2617e+01} {z-velocity 9.0445e-04} {energy 4.5605e-06} }
3 {{continuity 2.3250e-01} {x-velocity 1.6896e-03} {y-velocity 1.2536e-02} {z-velocity 9.8980e-03} {energy 3.4032e-06} }
4 {{continuity 8.0243e-02} {x-velocity 2.2180e-03} {y-velocity 1.3189e-02} {z-velocity 1.0225e-02} {energy 4.6336e-07} }
5 {{continuity 7.0923e-02} {x-velocity 2.2674e-03} {y-velocity 1.2308e-02} 我试图使用regex将其拆分为列,方法是获取第一个数字,然后在括号"{}“之间获取所有数字,并给它们命名如下:
names=['iter', 'x', 'x-vel', 'y-vel', 'z-vel', 'energy']然而,我似乎并没有使正则表达式工作起来,下面是我在一个简单示例中所做的工作:
输入
>>> a = "1 {{continuity 1.0000e+00} {x-velocity 0.0000e+00} {y-velocity 4.4010e-02} {z-velocity 9.5681e-04} {energy 1.1549e-07} }"
>>> re.findall("(\d*) {*\{\D*(.*?)\}", a)结果
>>> [('1', '1.0000e+00'), ('', '0.0000e+00'), ('', '4.4010e-02'), ('', '9.5681e-04'), ('', '1.1549e-07')]正如您所看到的,我的正则表达式一直在为每一个{}事件寻找一个数字,但我不希望这种情况发生,如何做到呢?
期望行为
>>> [('1'), ('1.0000e+00'), ('0.0000e+00'), ('4.4010e-02'), ('9.5681e-04'), ('1.1549e-07')]当我的正则表达式正常工作时,我尝试用如下所示的行分配所有列:
df[names] = df.first.str.extract(r'(\d*) {*\{\D*(.*?)\}', expand=True)我对数据处理非常陌生,这是解决这个问题的正确方法吗?
任何帮助都将不胜感激,谢谢提前!
发布于 2018-05-06 01:46:54
首先,让我们根据问题中的一些数据做一个系列。
import pandas as pd
data = pd.Series('''\
1 {{continuity 1.0000e+00} {x-velocity 0.0000e+00} {y-velocity 4.4010e-02} {z-velocity 9.5681e-04} {energy 1.1549e-07} }
2 {{continuity 1.0000e+00} {x-velocity 7.8788e-04} {y-velocity 1.2617e+01} {z-velocity 9.0445e-04} {energy 4.5605e-06} }
3 {{continuity 2.3250e-01} {x-velocity 1.6896e-03} {y-velocity 1.2536e-02} {z-velocity 9.8980e-03} {energy 3.4032e-06} }
4 {{continuity 8.0243e-02} {x-velocity 2.2180e-03} {y-velocity 1.3189e-02} {z-velocity 1.0225e-02} {energy 4.6336e-07} }'''
.split('\n'))
print(data)0 1 {{continuity 1.0000e+00} {x-velocity 0.0000e...
1 2 {{continuity 1.0000e+00} {x-velocity 7.8788e...
2 3 {{continuity 2.3250e-01} {x-velocity 1.6896e...
3 4 {{continuity 8.0243e-02} {x-velocity 2.2180e...
dtype: object
0 第一个选项是一个简单的正则表达式,它按顺序查找所有数字。使用extractall查找每个字符串中的每个匹配项。这可能就足够了。您仍然需要命名列,这并不难。这将有一个MultiIndex (这稍微高级一点),因为每个匹配可能有多个组(但这个正则表达式只有一个组),因此需要对其进行.unstack()。
print(data.str.extractall(r'(\d[\d.e+-]*)').unstack())match 0 1 2 3 4 5
0 1 1.0000e+00 0.0000e+00 4.4010e-02 9.5681e-04 1.1549e-07
1 2 1.0000e+00 7.8788e-04 1.2617e+01 9.0445e-04 4.5605e-06
2 3 2.3250e-01 1.6896e-03 1.2536e-02 9.8980e-03 3.4032e-06
3 4 8.0243e-02 2.2180e-03 1.3189e-02 1.0225e-02 4.6336e-07 或者,您可以使用命名组regex。这是一个非常简单的模板,可以从其中一个字符串构建。这将把regex中的名称放入列中。但是名称必须是有效的Python标识符。(x_vel,而不是x-vel)但这可能是您想要的,因为它允许您以attrs的形式访问列(比如df.x_vel而不是df['x-vel'])。(?P<foo>...)命名的组语法在re模块文档中都有解释。
print(
data.str.extract(r'(?P<iter>\d+) {{continuity (?P<x>[^}]+)} {x-velocity (?P<x_vel>[^}]+)} {y-velocity (?P<y_vel>[^}]+)} {z-velocity (?P<z_vel>[^}]+)} {energy (?P<energy>[^}]+)} }',
expand=False)) iter x x_vel y_vel z_vel energy
0 1 1.0000e+00 0.0000e+00 4.4010e-02 9.5681e-04 1.1549e-07
1 2 1.0000e+00 7.8788e-04 1.2617e+01 9.0445e-04 4.5605e-06
2 3 2.3250e-01 1.6896e-03 1.2536e-02 9.8980e-03 3.4032e-06
3 4 8.0243e-02 2.2180e-03 1.3189e-02 1.0225e-02 4.6336e-07请注意,这里使用的是extract而不是extractall,因为正则表达式本身有多个组。
https://stackoverflow.com/questions/50160986
复制相似问题