如何在pandas agg函数中使用带有pd.Series对象的if语句

时间:2017-02-22 15:32:17

标签: python pandas

我正在尝试聚合其中一列包含某些网址的数据集。请考虑以下数据集

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的等价物?

2 个答案:

答案 0 :(得分:2)

您的比较不起作用,因为x是整个系列,而不仅仅是您正在处理的项目。这有效:

df.groupby("ID")['Website'].agg(lambda x: "; ".join([site for site in x.values if "auction" in site]))

答案 1 :(得分:2)

您可以使用pandas builtin 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})