簡體   English   中英

使用正則表達式將DataFrame列拆分為列?

[英]Spliting a DataFrame column to columns with regex?

我有一個包含兩列的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} 

我正在嘗試使用正則表達式將其分為幾列,方法是獲取第一個數字,然后將方括號“ {}”之間的所有數字都命名為以下名稱:

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)

我真的是數據框的新手,這是解決此問題的正確方法嗎?

任何幫助將不勝感激,在此先感謝!

首先,讓我們從問題中的一些數據中得出一系列數據。

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     

或者,您可以使用命名組正則表達式。 這是從其中一個字符串構建的相當簡單的模板。 這會將正則表達式中的名稱放入列中。 但是名稱必須是有效的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 ,因為正則表達式本身有多個組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM