2016-05-31 14 views
2

私はテキストデータを扱っているので、既存の列に基づいて新しい列を作成したいだけです。Pandasデータフレームで分割を使用して列を取り込む

例:列sourceEncodedIDa.b.cのような値を有することができると私は、利用可能な2番目の部分はありますならば、文字列の唯一の第二部、bを抽出したいと思います。ここではいくつかの例の値は次のとおりです。

のみ20Kデータフレーム内の行とコードの、まだこの作品があります
for i in range(0,20350): 
    if len(str(artifacts.sourceEncodedID[i]).split('.')) > 1: 
     artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]).split('.')[1] 
    else: 
     artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]) 

に分を取る:

sourceEncodedID Branch  
a.b.c    b  
c.r.d    r  
a     a  
p     p 

はこれを実現するために、私は次のコードが出ていますブラウザを終了してレンダリングを応答しないようにする前に実行してください(私はipython notebookを使用しています)。私はこれが数秒で実行されると思ったでしょう。

このコードにはわかりづらいものがありますか?どうすれば修正できますか?

答えて

1

アップデート2: - 私はこれは少し速くなると信じて:20K DFの

x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1') 

はタイミング:

In [155]: x.shape 
Out[155]: (20000, 2) 

In [156]: %timeit x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1') 
10 loops, best of 3: 127 ms per loop 

UPDATE:

In [68]: x['new'] = x.sourceEncodedID 

In [69]: x 
Out[69]: 
    sourceEncodedID Branch new 
0   a.b.c  b a.b.c 
1   c.r.d  r c.r.d 
2    a  a  a 
3    p  p  p 

In [70]: x.ix[x.sourceEncodedID.str.contains('\.'), 'new'] = x.sourceEncodedID.str.split('\.', expand=True)[1] 

In [71]: x 
Out[71]: 
    sourceEncodedID Branch new 
0   a.b.c  b b 
1   c.r.d  r r 
2    a  a a 
3    p  p p 

で作業する場合パンダのデータフレームは常に最初ベクトル化された解を探してみてください。そして、それが絶対に不可能な場合にのみ、それを二重にチェックしてください。

OLD答え:

はこれを試してみてください。

In [61]: x.sourceEncodedID.str.split('\.', expand=True)[1] 
Out[61]: 
0  b 
1  r 
2 None 
3 None 
Name: 1, dtype: object 
+0

おかげでそんなに、それは仕事をしてくれました。私のコードでわからない愚かさを指摘できますか? – Patthebug

+0

@Patthebug、私は私の答えを更新しました - チェックしてください – MaxU

+0

説明を追加していただきありがとう、私はそれを感謝します! パンダのベクトル化された機能を知り、基本に戻って時間を費やすのはちょっとイライラしていると思います。私は、ベクトル化されたソリューションはもっときちんとしているが、あなたはそれらを知っている必要があります。一度に1つの機能! – Patthebug

関連する問題