假设我有包含一堆列的 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'
我该如何解决这个问题?
你们有更好的方法来解决最初的问题吗?
要了解这里发生的情况,请尝试以下示例:
我们可以看到
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
需要两个输入,这就是您收到错误消息的原因。