2017-02-22 216 views
0

我想要聚合其中一列包含一些URL的數據集。請看下面的數據集如何在pandas中使用if語句與pd.Series對象的聚合功能

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不同系列)。如果所有的項目都包含這個單詞,或者它們中的任何一個都足夠,大熊貓不知道你是否想加入。我也不知道你想如何加入,但是如果你只想加入包含字符串拍賣的網站,那麼在x上的一個條件而不是一個條件,只要將理解改爲'site for site in x if'auction'in網站' – ayhan

+1

@ayhan謝謝你的解釋,它肯定有助於解釋發生了什麼問題。我正在解釋這個過程,循環遍歷每個'x'的值,只選擇那些發現「拍賣」的地方。我現在明白實際發生了什麼。 – brittenb

回答

2

您可以使用內置的熊貓和pd.Series.str.contains方法pd.Series.str.cat明確地做到這一點:

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

這不起作用,因爲它會導致lambda函數內部的一個系列而不是單個值。熊貓會抱怨。 – 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]))