【问题标题】:Pandas - Lambda inside apply to return a rowPandas - 内部的 Lambda 应用返回一行
【发布时间】:2020-12-29 18:12:39
【问题描述】:

在 Pandas DataFrame 中的应用程序中使用 lambda 函数时,我希望得到整行,但看起来我得到的是“单个元素”。

看看那个代码:

# Data sample
reviews_2 = pd.DataFrame({
    'price': {0: None, 1: 15.0, 2: 14.0, 3: 13.0}, 
    'country': {0: 'Italy', 1: 'Portugal', 2: 'US', 3: 'US'}, 
    'points': {0: 87, 1: 87, 2: 87, 3: 87}
})

print(reviews_2)

mean_price_2 = reviews_2.price.mean() # a value to centering

def remean_points(row):
    row.price = row.price - mean_price_2
    return row

centered_price_2 = reviews_2.apply(remean_points, axis='columns') # returns a DataFrame

print(centered_price_2)

“应用”返回一个 DataFrame。这是我的预期输出!

所以,我尝试使用 lambda 函数,这样做:

reviews_2 = pd.DataFrame({
    'price': {0: None, 1: 15.0, 2: 14.0, 3: 13.0}, 
    'country': {0: 'Italy', 1: 'Portugal', 2: 'US', 3: 'US'}, 
    'points': {0: 87, 1: 87, 2: 87, 3: 87}
})
print(reviews_2)

mean_price_2 = reviews_2.price.mean()

centered_price_2 = reviews_2.apply(lambda p: p.price - mean_price_2, axis='columns') # returns a Serie!

print(centered_price_2)

但是现在,“应用”返回一个 Serie!

我知道apply 会尝试识别类型。
我正在等待获得一行,但它看起来返回一个“单个元素”......

所以我的问题:

lambda函数中的p不应该是一行?

有趣:

如果我这样做centered_price_2 = reviews_2.apply(lambda p: p, axis='columns')
我得到一个数据框...

还是:

如何使用lambdaapply函数并确定输出类型?!

【问题讨论】:

  • 您正在寻找的所需/期望的输出是什么?那centered_price_2 - 你需要它是什么?新专栏?
  • p 在 lambda 函数中一行。问题在于返回类型的差异。第一个函数返回一个pd.Series 对象,第二个函数返回一个标量。它是一个 lambda 函数的事实是无关紧要的(它几乎从不相关)
  • 所以,它相当于def remean_points(row): return row.price - mean_price_2
  • @DanailPetrov 我想获得一个不同于 Kaggle 练习的 DataFrame...
  • 无论如何,你几乎肯定不应该使用 .apply 开始。

标签: python python-3.x pandas lambda apply


【解决方案1】:

目前还不是很清楚预期的确切输出是什么,所以我希望这就是你要找的?

newcol 将具有 price - mean price

>>> reviews_2['newcol'] = reviews_2['price'].apply(lambda x: x - reviews_2.price.mean())

   price   country  points  newcol
0    NaN     Italy      87     NaN
1   15.0  Portugal      87     1.0
2   14.0        US      87     0.0
3   13.0        US      87    -1.0

【讨论】:

  • 我编辑了我的帖子以说出预期的输出:一个像第一个一样的新 DataFrame!
  • 这真的应该是reviews_2['price'] = reviews_2['price'] - reviews_2['price'].mean()
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2013-02-11
相关资源
最近更新 更多