2017-09-20 8 views
2

したがって、ある列にテキストを含むデータフレームがあります。 私は、列の各行の中で2つの文字列を見つけようとしていて、それらの2つの文字列の間の行テキストをスライスして部分文字列を取得しようとしています。このような何か:他の列の値を使用してパンダの列をスライスする

startinds = df[column].str.find("First Event = ") 
endinds = df[column].str.find("\nLast Event = ") 

df["first_timestamp"] = df[column].str.slice(startinds,endinds) 

startindsendindsはシリーズですので、私はcolumn内の文字列をスライスするための指標としてそれらを使用することはできませんので、今これは動作しません。

誰でも、各行で部分文字列を処理するための値にアクセスする方法を知っていますか?

例入力:

Data 
0 "Blahblah 
    First Event = 09/20/2017 12:00:00 
    Last Event = 09/20/2017 13:00:00 
    Blahblahblah" 
1 "Blahblahblahblah 
    Blahablahblah 
    First Event = 09/20/2017 12:30:00 
    Last Event = 09/20/2017 12:45:00 
    Blahblahblah" 

出力:

first_timestamp 
0 "First Event = 09/20/2017 12:00:00" 
1 "First Event = 09/20/2017 12:30:00" 
+2

それは[githubの上の未解決の問題](https://github.com/pandas-dev/pandas/issues/8748)です。おそらく、手動で行う必要があります。 – IanS

+2

''最初のイベント= "+ df.Data.str.extract( '(?<=最初のイベント=)(?*)(?= \\\\ n最後のイベント)'、expand = False)'? – Zero

答えて

2

コメントで答えとは違って、Series.str.extractと、このアプローチは動作するはずない:

df['first_timestamp'] = df['Data'].str.extract('(First Event = .+)') 

#             Data \ 
# 0 Blahblah\nFirst Event = 09/20/2017 12:00:00\nL... 
# 1 Blahblahblahblah\nFirst Event = 09/20/2017 12:... 
# 
#      first_timestamp 
# 0 First Event = 09/20/2017 12:00:00 
# 1 First Event = 09/20/2017 12:30:00 

'(First Event = .+)'はAキャプチャパターングループ(すなわち、())を "First Event =" fo 1つまたは複数の文字(すなわち、 .+)、改行で停止します(.文字は改行以外のものに一致します)。

+0

@andraiamatrix正規表現の '.'文字は、改行以外のものと一致します(したがって、'。+ 'は改行以外のもののうちの1つ以上にマッチします)。更新された質問に基づいて、 'df ['Data']のようになります。str.extract( '(First Event =。+)')'あなたのfirst_timestampグループを取得します。私は私の答えを更新します。 – cmaher

+0

私は '。+'が改行で停止することに気付きましたが、キャリッジリターン '\ r'で停止するわけではありません。いずれかで停止するものはありますか?私は '(First Event =。+)[\ r \ n]'を試みましたが、キャリッジリターンが私の出力に現れるのを止めませんでした。 – andraiamatrix

+1

'.'を使用する代わりに、これを試すことができますか? 'df ['Data']。str.extract( '(最初のイベント= [^ \ n \ r] +)')' – cmaher

3

あなたのスライス方法を完了するには、あなたがDFでstartindsendindsを保存ラムダすなわち使用して、すなわち、列全体にラムダを使用して列に基づいて文字列をスライスすることができます

df['startinds'] = df['Data'].str.find("First Event = ") 
df['endinds'] = df['Data'].str.find("\\nLast Event = ") 

df.apply(lambda x : str(x['Data'])[x['startinds']:x['endinds']],1) 
(あなたが \nを取得するには、エスケープ文字を必要とする注意してください)

出力:

 
0 First Event = 09/20/2017 12:00:00 
1 First Event = 09/20/2017 12:30:00 
dtype: object 
+0

私の悪いです。 \ nは改行文字です。私はちょうど実際の改行をする代わりにサンプルデータにそれらを投げた。文字通りのバックスラッシュではありません。私はオリジナルを編集しました – andraiamatrix

+0

小さな疑問は、常に2行目の最初のイベントですか? – Dark

+0

いいえ、どこでもかまいません。場合によっては、データに実際には含まれないこともあります。私は正規表現の解決法を使用しなければならないことに気付きました。なぜなら、この文字列スライシングはキーワードが表示されないときには機能しないからです。 – andraiamatrix

関連する問題