在Pandas中使用lambda和.apply()

2024-10-16 20:39:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在Pandas中,我试图使用.apply()应用这个lambda函数,我得到了一个错误:“ValueError:序列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()

我做错了什么

(beers[:10] - beers.mean()).apply(lambda x: 'low' if x < 0 else 'high')

啤酒是一个系列

谢谢


Tags: lambda函数pandas错误any序列allmean
2条回答

beers不是Series否则代码工作正常。它当然是一个DataFrame并且很可能是一个DataFrame只有一列

演示:

>>> beers = pd.Series(np.random.randint(1, 10, 20))

>>> type(beers)
pandas.core.series.Series

>>> (beers[:10] - beers.mean()).apply(lambda x: 'low' if x < 0 else 'high')
0    high
1     low
2    high
3     low
4    high
5    high
6     low
7    high
8    high
9     low
dtype: object

现在,如果beersDataFrame

>>> beers = beers.to_frame()

>>> type(beers)
pandas.core.frame.DataFrame

>>> (beers[:10] - beers.mean()).apply(lambda x: 'low' if x < 0 else 'high')
...
ValueError: The truth value of a Series is ambiguous.
Use a.empty, a.bool(), a.item(), a.any() or a.all().

beers只有一列的情况下,可以使用squeeze

>>> (beers[:10] - beers.mean()).squeeze().apply(lambda x: 'low' if x < 0 else 'high')
0    high
1     low
2    high
3     low
4    high
5    high
6     low
7    high
8    high
9     low
Name: 0, dtype: object

我想你想做的是 如果啤酒是一个系列,如果它是一个df,你也需要列名

beers_mean = beers.mean()
beers[:10].apply(lambda x: 'low' if (x-beers_mean)<0 else 'high'

它不能将啤酒[:10]-beers.mean()放入一个新的系列,这就是为什么会出现异常

如果beers是DF,并且您希望在表中的单个列上执行此操作,那么 只是先挑的

beer_col = beers[['col_name']]
beers_mean = beer_col .mean()
beer_col[:10].apply(lambda x: 'low' if (x-beers_mean)<0 else 'high'

相关问题 更多 >