Pandas - Lambda 内部应用以返回一行

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

我原本希望在 Pandas DataFrame 中的 apply 中使用 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)

但是现在,“申请”返回一个系列!

我知道

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

所以我的问题:

lambda 函数中的

p
不应该是一行?

有趣:

如果我这样做

centered_price_2 = reviews_2.apply(lambda p: p, axis='columns')

我得到一个数据框...

然而:

如何使用

lambda
apply
函数并确定输出类型?!

python python-3.x pandas lambda apply
2个回答
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

0
投票

这个问题是在2020完成的,现在,在2024,回顾我的开放问题我对Pandas有了更多的了解(只是一点点)!

所以...

我的错误在这里:

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!

我解释一下:

  1. 就像我当时所说的,
    apply
    尝试识别使用的类型。
  2. mean_price_2 = reviews_2.price.mean()
    Serie
  3. 所以,即使
    p
    是一个整体
    DataFrame
    ,我的 lambda 函数表达式
    centered_price_2 = reviews_2.apply(lambda p: p.price - mean_price_2, axis='columns')
    也会返回一个
    Serie
  4. 因为,
    p.price - mean_price_2
    返回
    Serie

在2020年,我错误地确实认为

lambda p:...
应该始终返回a
DataFrame
,因为
p
a
DataFrame

修复我的代码的一个解决方案是:

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() # note the next two lines centered_price_2 = reviews_2 # 'Copy' the DataFrame centered_price_2.price = reviews_2.apply(lambda p: p.price - mean_price_2, axis='columns') # Only change the desired column! print(centered_price_2)
2024 年快乐!

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