2016-12-07 9 views
1

dfのようなpandasデータフレームがあり、df2のように列を追加したいと思います。return pandas別の列の部分文字列を持つdataframe列

import pandas as pd 
df =pd.DataFrame({'Alternative' : ['a_x_17MAR2016_Collectedran30dom', 'b_17MAR2016_CollectedStuff', 'c_z_k_17MAR2016_Collectedan3dom'], 'Values': [34, 65, 7]}) 

df2 = pd.DataFrame({'Alternative' : ['a_x_17MAR2016_Collectedran30dom', 'b_17MAR2016_CollectedStuff', 'c_z_k_17MAR2016_Collectedan3dom'], 'Values': [34, 65, 7], 'Alts': ['a x 17MAR2016', 'b 17MAR2016', 'c z k 17MAR2016']}) 

    df 
Out[4]: 
         Alternative Values 
0 a_x_17MAR2016_Collectedran30dom  34 
1  b_17MAR2016_CollectedStuff  65 
2 c_z_k_17MAR2016_Collectedan3dom  7 

df2 
Out[5]: 
         Alternative    Alts Values 
0 a_x_17MAR2016_Collectedran30dom a x 17MAR2016  34 
1  b_17MAR2016_CollectedStuff  b 17MAR2016  65 
2 c_z_k_17MAR2016_Collectedan3dom c z k 17MAR2016  7 

つまり、さまざまな長さのアンダースコア区切り文字で区切ることができる文字列があります。私はそれを分離し、それをスペースで区切って結合したいが、 'Collected'という部分文字列を含む文字列で始めると、任意の文字列を取り除きたい。

hereという部分文字列を含む文字列のインデックスを個々のリストに配置してから、他の文字列を結合することはできますが、データフレーム

答えて

2

'

df.Alternative.str.replace('_[^_]*Collected.*', '').str.replace('_', ' ') 

出力

0  a x 17MAR2016 
1  b 17MAR2016 
2 c z k 17MAR2016 
+0

混乱して申し訳ありませんが、私はこれが質問に答えると感じ、再インポートする必要なしにパンダを使用します。私は助けに感謝します –

0
import re 
x = df.Alternative.apply(lambda x : re.sub("_Collected.*","",x)) 
# x 
#0  a_x_17MAR2016 
#1  b_17MAR2016 
#2 c_z_k_17MAR2016 

y = x.str.split("_") 
#0  [a, x, 17MAR2016] 
#1   [b, 17MAR2016] 
#2 [c, z, k, 17MAR2016] 

df['newcol'] = y.apply(lambda z: ' '.join(z)) 
#      Alternative Values   newcol 
#0 a_x_17MAR2016_Collectedran30dom  34 a x 17MAR2016 
#1  b_17MAR2016_CollectedStuff  65  b 17MAR2016 
#2 c_z_k_17MAR2016_Collectedan3dom  7 c z k 17MAR2016 

すべて1行で事前に

ありがとう:私は、これは技術的に収集された言葉「を含んでいない日などの所望の出力に一致する質問に答えるが、ないだろうと考えてい

import re 
df['newcol'] = df.Alternative.apply(lambda x : re.sub("_Collected.*","",x)).str.split("_").apply(lambda z: ' '.join(z)) 

#      Alternative Values   newcol 
#0 a_x_17MAR2016_Collectedran30dom  34 a x 17MAR2016 
#1  b_17MAR2016_CollectedStuff  65  b 17MAR2016 
#2 c_z_k_17MAR2016_Collectedan3dom  7 c z k 17MAR2016 
+0

これは、特に「収集」という文字列を検索しません –

+0

しかし、あなたが共有として期待される出力を取得するには、検索する必要はありません収集された権利のために? –

+0

はい、あなたの出力はJeff Tiltonが望む出力に一致しますが、彼の質問には答えません。私の答えは彼の質問に答えるが、彼の結果とは一致しない。彼は少し物事を明確にする必要があります。 –

2

使用
str.split

alts = df.Alternative.str.split('_').str[:-1].str.join(' ') 
df.insert(1, 'Alts', alts) 
df 

enter image description here

関連する問題