首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python应用具有多列的lambda

Python应用具有多列的lambda
EN

Stack Overflow用户
提问于 2022-10-25 14:56:51
回答 2查看 42关注 0票数 0

有人能告诉我为什么不起作用吗?怎么解决?

我试图使用lambda函数根据另一列上的条件选择列的值。

代码语言:javascript
复制
df = pd.DataFrame({'A': [4, 8, 2, 7, 4],
                   'B': [8, 10, 3, 4, 1],
                   'C': [10, 8, 2, 6, 2]})

df
代码语言:javascript
复制
`df.apply(lambda x: x['B'] if x['A'].isin([1,2,3,4,5]) else x['C'])`
代码语言:javascript
复制
KeyError                                  Traceback (most recent call last)
c:\xxxxxx\xxxxxx\xxx Cellule 19 in <cell line: 1>()
----> 1 df.apply(lambda x: x['B'] if x['A'].isin([1,2,3,4,5]) else x['C'])

File c:\Anaconda\envs\xxxxx\xxxx.py:8839, in DataFrame.apply(self, func, axis, raw, result_type, args, **kwargs)
   8828 from pandas.core.apply import frame_apply
   8830 op = frame_apply(
   8831     self,
   8832     func=func,
   (...)
   8837     kwargs=kwargs,
   8838 )
-> 8839 return op.apply().__finalize__(self, method="apply")

File c:\Anaconda\xxxxxlib\site-packages\pandas\core\apply.py:727, in FrameApply.apply(self)
    724 elif self.raw:
    725     return self.apply_raw()
--> 727 return self.apply_standard()

File c:\Anaconda\envs\xxxx\pandas\core\apply.py:851, in FrameApply.apply_standard(self)
    850 def apply_standard(self):
--> 851     results, res_index = self.apply_series_generator()
    853     # wrap results
    854     return self.wrap_results(results, res_index)
...
    388     self._check_indexing_error(key)
--> 389     raise KeyError(key)
    390 return super().get_loc(key, method=method, tolerance=tolerance)

KeyError: 'A'
EN

回答 2

Stack Overflow用户

发布于 2022-10-25 15:07:58

不要使用apply,这是对熊猫矢量能力的浪费。

改为使用:

代码语言:javascript
复制
df['new'] = df['B'].where(df['A'].isin([1,2,3,4,5]), df['C'])

# or
df['new'] = df['B'].where(df['A'].between(1, 5, inclusive='both'), df['C'])

或使用numpy

代码语言:javascript
复制
import numpy as np
df['new'] = np.where(df['A'].isin([1,2,3,4,5]), df['B'], df['C'])

产出:

代码语言:javascript
复制
   A   B   C  new
0  4   8  10    8
1  8  10   8    8
2  2   3   2    3
3  7   4   6    6
4  4   1   2    1
票数 1
EN

Stack Overflow用户

发布于 2022-10-25 14:57:48

您需要指定axis=1属性。请参阅dataframe.apply

代码语言:javascript
复制
df.apply(lambda x: x['B'] if x['A'].isin([1,2,3,4,5]) else x['C'], axis=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74196081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档