我在 groupby 对象中选择了两列。如何在其中一个上应用 true 或 false 过滤器,然后在另一个上应用函数?

问题描述 投票:0回答:1

假设我有包含一堆列的 Airbnb 数据集。感兴趣的是“neighbourhood_cleansed”、“host_is_superhost”和“price”。我希望找到超级房东和非超级房东的中位价格差异最大的社区。

我想知道这是否可以完全使用 pandas 函数来完成。

我的逻辑是首先按'neighbourhood_cleansed'进行分组,然后将groupby对象过滤为超级主机和非超级主机,然后使用中值函数。

我定义了一个函数 func

def func(host_is_superhost, price):
    superhost_prices = price[host_is_superhost == 't']
    notsuperhost_prices = price[host_is_superhost == 'f']
    return (superhost_prices.median() - notsuperhost_prices.median())
listings = pd.read_csv("https://storage.googleapis.com/public-data-337819/listings%202%20reduced.csv",low_memory=False)
neighbourhoods = listings.groupby('neighbourhood_cleansed')[['host_is_superhost', 'price']]

当我运行以下命令时:

neighbourhoods.apply(func)

抛出的错误是

TypeError: func() missing 1 required positional argument: 'price'

我该如何解决这个问题?

你们有更好的方法来解决最初的问题吗?

pandas group-by data-analysis
1个回答
0
投票

要了解这里发生的情况,请尝试以下示例:

我们可以看到

source
列只有两个值。

listings["source"].unique()
Out: array(['city scrape', 'previous scrape'], dtype=object)

让我们尝试使用 groupby 的

func
的更简单版本:

def func2(row):
    print(type(row))
    print(len(row))
    
    
grpby = listings.groupby("source")[["host_is_superhost", "price"]]
grpby.apply(func2)

打印出来:

<class 'pandas.core.frame.DataFrame'>
55934
<class 'pandas.core.frame.DataFrame'>
32012

这有助于我们理解,当使用

apply
时,
func2
会被传递给具有不同长度的单个
pd.DataFrame
对象。

您原来的

func
需要两个输入,这就是您收到错误消息的原因。

© www.soinside.com 2019 - 2024. All rights reserved.