通过在两个现有列上使用 lambda 函数在 Panda 中创建一个新列

Posted

技术标签:

【中文标题】通过在两个现有列上使用 lambda 函数在 Panda 中创建一个新列【英文标题】:Creating a new column in Panda by using lambda function on two existing columns 【发布时间】:2016-02-14 07:43:24 【问题描述】:

我可以通过定义用户函数然后使用 apply 在 Panda 中添加一个新列。但是,我想使用 lambda 来做到这一点;有办法吗?

例如,df 有两列 ab。我想创建一个新列c,它等于ab 之间的最长长度。

类似的东西:

df['c'] = df.apply(lambda x, len(df['a']) if len(df['a']) > len(df['b']) or len(df['b']) )

一种方法:

df = pd.DataFrame('a':['dfg','f','fff','fgrf','fghj'], 'b' : ['sd','dfg','edr','df','fghjky'])

df['c'] = df.apply(lambda x: max([len(x) for x in [df['a'], df['b']]]))
print df
      a       b   c
0   dfg      sd NaN
1     f     dfg NaN
2   fff     edr NaN
3  fgrf      df NaN
4  fghj  fghjky NaN

【问题讨论】:

修复语法错误后即可使用。 lambda x 后面需要一个冒号,而你的表达式缺少 else(也许应该用它代替 or)。 感谢您的快速响应,但仍然无法正常工作。这是代码和错误消息。如果您能提供任何帮助,我将不胜感激。 df = pd.DataFrame('a':['dfg','f','fff','fgrf','fghj'],'b': ['sd','dfg','edr', 'df','fghjky']) df['c'] = df.apply(lambda x: len(x['a']) if len(x['a']) > len(x['b ']) else len(x['b'])) KeyError: ('a', u'occurred at index a') 请不要将代码放入 cmets,edit 改为问题。 对不起,这是我第一次来这里。我尝试编辑我的问题,但它仍然没有以一种很好的格式出现 在编辑模式下,有一个打开格式化帮助的按钮。首先,您可以选择代码并按 Ctrl-K,它将缩进 4 个空格。 【参考方案1】:

您可以使用函数map并按函数选择np.wheremore info

print df
#     a     b
#0  aaa  rrrr
#1   bb     k
#2  ccc     e
#condition if condition is True then len column a else column b
df['c'] = np.where(df['a'].map(len) > df['b'].map(len), df['a'].map(len), df['b'].map(len))
print df
#     a     b  c
#0  aaa  rrrr  4
#1   bb     k  2
#2  ccc     e  3

下一个解决方案是使用函数apply 和参数axis=1

axis = 1 or ‘columns’:对每一行应用函数

df['c'] = df.apply(lambda x: max(len(x['a']), len(x['b'])), axis=1)

【讨论】:

Map 可能有效,但主要是我正在寻找一种将 Lambda 与两列一起使用并在可能的情况下创建一个新列的方法 为什么要使用 lambda? 使用 lambda 的原因是打字少,对我来说代码更具可读性 对于未来的读者来说,错误是忘记了轴 = 1(这导致了 KeyError 'a',因为我们正在遍历 row_indexer [0,1,2,3,4])而不是df['a'],df['b']。而且 Jezraels 解决方案#2 更简洁一些,因为 lambda 已经遍历了行。

以上是关于通过在两个现有列上使用 lambda 函数在 Panda 中创建一个新列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloudformation 将 lambda 函数附加到现有 API 网关

函数式编程-Lambda与Stream

在现有 S3 对象上运行 S3-put 触发的 Lambda 函数?

在 Pandas 数据框中的不同列上使用 lambda if 条件

如何将新的 Lambda 函数部署到现有 Rest Api 的 Stage?

Linq to SQL 使用 Lambda 语法进行左外连接并在 2 列上连接(复合连接键)