2016-04-18 10 views
1

は、次のように私は、このようなデータフレームがあると、データフレームの列の各行の単語を検索して、新しい列を追加する - Pythonの

data 

    id URL 
    1 www.pandora.com 
    2 m.jcpenney.com 
    3 www.youtube.com 
    4 www.facebook.com 

を私はgrepすると見つけ、特定の単語をURLにして作成したいですその中に新しい列があります。

id URL     host 
1 www.pandora.com  None 
2 m.jcpenney.com  None 
3 www.youtube.com  youtube 
4 www.facebook.com facebook 

URLは、実際のデータセットで非常に複雑であり、また、行数は(〜4M)非常に高いです、私はここだけで、私の理想的な出力は次のようになりユーチューブやフェイスブックを見つけたいとします。だから私は3-4の特定のホストだけを見つけて、新しいコラムでそれらを識別したいと思っています。続き

は、私の試みである

for i in data['URL']: 
    re.search('youtube', i) 

が、私はここで、

TypeError: expected string or buffer 

エラーを取得しています。私は3-4ホストのための条件を与えると同じデータフレーム内の新しい列を作成し、残りの列にはないだろう。誰か助けてくれますか?私たちは、データフレームをインスタンス化し、新しい列hostを作成することから始めましょう

おかげ

+0

Pandas DataFramesの部分文字列検索の例については、この[質問](http://stackoverflow.com/questions/11350770/pandas-dataframe-select-by-partial-string)をご覧ください。 – SNygard

+0

@SNygardそのリンクをありがとう。今では、それぞれを別々のデータフレームに分割できます。しかし、私は異なる条件に基づいて新しい列を作成したい。あなたはそれを手伝ってくれますか? – haimen

答えて

0

。この段階で

import pandas as pd 
df = pd.DataFrame({'id': [1,2,3,4], 
        'URL': ['www.pandora.com', 'm.jcpenney.com', 'www.youtube.com', 'www.facebook.com']}) 
df['host'] = None 

、データフレームは、次のようになります。

id URL     host 
1 www.pandora.com  None 
2 m.jcpenney.com  None 
3 www.youtube.com  None 
4 www.facebook.com None 

我々はURL列内の部分文字列を検索するためのforループを作成することができます。次のコードは、URL列に検索項目が含まれる位置にのみdf['host']列を書き込みます。

for item in ['youtube', 'facebook']: 
    df['host'][df['URL'].str.contains(item)] = item 

は今、データフレームは、次のようになります。あなたは次の警告を得ることができます

id URL     host 
1 www.pandora.com  None 
2 m.jcpenney.com  None 
3 www.youtube.com  youtube 
4 www.facebook.com facebook 

注:

C:\Anaconda3\envs\pyvizz\lib\site-packages\ipykernel\__main__.py:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

警告はちょうど私たちは、上書きしているを教えてくれるある位置のデータ。この場合、のNoneyoutubeまたはfacebookで上書きしています。したがって、私たちの場合、警告は無視されます。

あなたが言及したすべての検索は、部分文字列検索です(youtubeが部分文字列かどうかを確認してください)。しかし、findallメソッドでは、より複雑な正規表現検索を行うことができます。

import re 
for item in ['youtube', 'facebook']: 
    results = df['URL'].str.findall('(%s)' % item) 
    df['host'][pd.Series(map(lambda x: False if len(x) == 0 else True, results))] = item 

findallは、データフレームに正規表現(youtube)などを適用します。次に、len(x) == 0の場合は、項目をFalseに割り当てます。つまり、正規表現が一致を検出した場合に限り、アイテムはTrueになります。 True/Falseシリーズをマスクとして、一致した値に一致するすべての項目を設定します:youtube

+0

"警告はちょうど我々がある位置のデータを上書きしていることを伝えている。 < - ehh?いいえ、そうではありません。この場合、リンクされたドキュメントが説明するように、連鎖インデックスを使用していないときに設定する連鎖インデックスを使用していることがわかります。 – DSM

+0

@DSMあなたはそうです。ただし、ドキュメントには、この例が含まれています。値を設定する方法として、 'dfb ['c'] [dfb.a.str.startswith( 'o')] = 42'があります。残念ながら、警告をスローします。あなたがより良い方法を持っている場合(多分現場操作は悪い考えですか?)、私の回答を編集するか、新しい回答を追加してください。私はそれから学ぶことができた! – SNygard

関連する問題