2017-02-22 4 views
0

列の1つにURLが含まれているデータセットを集計しようとしています。私は、次の分析を実行したいと思い、次のデータセットpandas agg関数内のpd.Seriesオブジェクトでif文を使用する方法

import pandas as pd 

df = pd.DataFrame({"ID": [1, 1, 1, 2, 2], 
        "Website": ["https://www.auctionbid.com", 
           "https://www.google.com", 
           "https://www.awesomeauctions.net", 
           "https://www.awesomeauctions.net", 
           "http://www.auctionnoitcua.com" 
           ] 
       }) 

を考えてみましょう:

(
df 
.groupby("ID") 
.agg({"Website": lambda x: 
     "; ".join([site for site in x if x.str.contains("auction")]) 
    }) 
) 

これはシリーズの真理値があいまいであることを示すValueErrorになります。受け入れられた答えはthis questionで、ifは暗黙的にオペランドをboolに変換し、 "ビットごとの"演算子を使用することを示唆しています。

私の質問では、&|ifに相当する機能を実装するにはどうすればよいですか。

+0

'X'シリーズ(各IDのためにあなたがAGGで別のシリーズを持っている)です。 pandasは、すべてのアイテムにその単語が含まれている場合、またはそのいずれかで十分である場合に参加したいかどうかを知りません。私はあなたがどのように参加したいのか分かりませんが、文字列オークションを含むウェブサイトだけに参加したいのであれば、xの条件ではなく、 'オークション'の場合はxのサイトのサイトにサイト ' – ayhan

+1

@ayhanこの説明をありがとう、間違っていたことを説明するのは間違いない。私はこの手順を「x」の各値をループし、「オークション」が見つかった場所だけを選択すると解釈していました。私は実際に何が起こっているのか理解しています。 – brittenb

答えて

2

あなたは明示的にこれを実現するためにパンダがpd.Series.str.containspd.Series.str.catメソッドを組み込み使用することができます。

join_func = lambda x: x[x.str.contains("auction")].str.cat(sep="; ") 
df.groupby("ID").agg({"Website": join_func}) 
+0

これは、ラムダ関数の内部ではなく、単一の値ではない系列になるため、機能しません。パンダは不平を言うでしょう。 – languitar

+0

右のジョインが見つかりませんでした。 – pansen

+0

私はこの答えを受け入れるつもりです。なぜなら、関数が何をしているのかが少しはっきりしているからです。 – brittenb

2

xは処理しているアイテムだけでなくシリーズ全体であるため、比較ができません。これは動作します:

df.groupby("ID")['Website'].agg(lambda x: "; ".join([site for site in x.values if "auction" in site])) 
関連する問題