2017-03-27 31 views
2

と列でグループパンダのデータフレームをする私は、次のデータフレームを持っている:どのように正規表現マッチ

次のようになります
import pandas as pd 
df = pd.DataFrame({'id':['a','b','c','d','e'], 
        'XX_111_S5_R12_001_Mobile_05':[-14,-90,-90,-96,-91], 
        'YY_222_S00_R12_001_1-999_13':[-103,0,-110,-114,-114], 
        'ZZ_111_S00_R12_001_1-999_13':[1,2.3,3,5,6], 
}) 

df.set_index('id',inplace=True) 
df 

:私は何をしたいか

Out[6]: 
    XX_111_S5_R12_001_Mobile_05 YY_222_S00_R12_001_1-999_13 ZZ_111_S00_R12_001_1-999_13 
id 
a       -14       -103       1.0 
b       -90       0       2.3 
c       -90       -110       3.0 
d       -96       -114       5.0 
e       -91       -114       6.0 

グループに列です最後にそれはMobile、およびごとにグループ化されていますようにするため

\w+_\w+_\w+_\d+_([\w\d-]+)_\d+ 

次の正規表現に基づいて、。

どうすればいいですか?私はこれを試してみましたが、グループにそれらを失敗:

Mobile 
1-999 
1-999 

そしてgroupプリントに対応するデータ・フレーム:私たちが望む何

XX_111_S5_R12_001_Mobile_05 
YY_222_S00_R12_001_1-999_13 
ZZ_111_S00_R12_001_1-999_13 

name版画にある版画

import re 
grouped = df.groupby(lambda x: re.search("\w+_\w+_\w+_\d+_([\w\d-]+)_\d+", x).group(), axis=1) 
for name, group in grouped: 
    print name 
    print group 

を。

+1

あなたが達成しようとしているかについて、いくつかの追加の詳細を与えるだろうか?元のデータフレームに3つのカラムしかない場合は、groupbyに3つのグループを出力しようとしているようです。さらに、groupbyの定義によって、グループ名/ラベル(あなたは 'name'と呼ばれました)はユニークなものなので、あなたが記述した望ましい出力は不可能です。最も近いのは、ラベルの行(モバイルと1-999)を作成し、代わりにグループ内のラベルを使用することですが、これがあなたがしようとしているものに関連するかどうかはわかりません。 –

答えて

2

あなたはgroupbyためextract substringsするために列に.str.extractを使用することができます:期待のグループを返します

# Performing the groupby. 
pat = '\w+_\w+_\w+_\d+_([\w\d-]+)_\d+' 
grouped = df.groupby(df.columns.str.extract(pat, expand=False), axis=1) 

# Showing group information. 
for name, group in grouped: 
    print name 
    print group, '\n' 

1-999 
    YY_222_S00_R12_001_1-999_13 ZZ_111_S00_R12_001_1-999_13 
id               
a       -103       1.0 
b        0       2.3 
c       -110       3.0 
d       -114       5.0 
e       -114       6.0 

Mobile 
    XX_111_S5_R12_001_Mobile_05 
id        
a       -14 
b       -90 
c       -90 
d       -96 
e       -91 
1

グループ化した後、新しいデータフレームのインデックスを[re.findall(r'\w+_\w+_\w+_\d+_([\w\d-]+)_\d+', col)[0] for col in df.columns](これは['Mobile', '1-999', '1-999'])に設定します。

+0

まだ動作しません – neversaint

+1

私は間違った説明に基づいて、あなたの質問を見落としたように見えます。あなたが持っている問題はグループ化に関連していません。インデックス作成に関連しています。 – DyZ

1

あなたは、いくつかのあなたの正規表現の問題、\wマッチ単語を持っていますあなたが望むもののようには見えない、文字と数字を一致させたい場合はA-Za-z0-9-を使用する方が良いでしょう:

df.groupby(df.columns.str.extract("([A-Za-z0-9-]+)_\d+$"), axis=1).sum() 

enter image description here