我原本希望在 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
目前还不清楚预期的确切输出是什么,所以我希望这就是您正在寻找的?
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
这个问题是在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!
我解释一下:
apply
尝试识别使用的类型。mean_price_2 = reviews_2.price.mean()
是Serie
。p
是一个整体 DataFrame
,我的 lambda 函数表达式 centered_price_2 = reviews_2.apply(lambda p: p.price - mean_price_2, axis='columns')
也会返回一个 Serie
!p.price - mean_price_2
返回 Serie
。在2020年,我错误地确实认为
lambda p:...
DataFrame
,因为p
是aDataFrame
。
修复我的代码的一个解决方案是:
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 年快乐!