【问题标题】:Python : How to use lambda function to return a specific value?Python:如何使用 lambda 函数返回特定值?
【发布时间】:2022-01-14 14:03:37
【问题描述】:

我有一个数据框,其中有一列“A”,其值可以是这样的:

[';', '', 'M;', 'M', ';M', 'M;M', ';;M']

如果我能在 A 列的行中找到“M”(是否有多个 M 无关紧要),我想在第二列“B”中返回值“M”。如果没有M,B 中的行应该留空。 我无法将其转换为 lambda 函数。有人可以帮忙吗?

df['B']=df['A'].apply(lambda x:x[....... if 'M' in x else None])

【问题讨论】:

  • 如果我理解正确,lambda 应该只返回文字 'M' 吗? df['B']=df['A'].apply(lambda x:'M' if 'M' in x else None)

标签: python lambda


【解决方案1】:

只需在 if 关键字之前使用您要返回的表达式:

df['B']=df['A'].apply(lambda x:'M' if 'M' in x else None)

理解这一点的关键是“lambda”将解析单个表达式,并返回其值,而 Python 中的内联“... if ... else ...”构造仅计算为第一个或最后一部分取决于测试表达式。

如果您没有在单个列中使用 apply,而是在整个数据框上使用(例如,如果您需要检查多列中的值),则必须将“axis=1”参数传递给申请。在这种情况下,虽然不需要,但最好在 lambda 周围有一对额外的括号。否则,代码的读者有责任确定将 lambda 主体与下一个参数分隔的“,”是否真的是分隔符或 lambda 的一部分:

df['B']=df.apply((lambda row:'M' if 'M' in row['A'] else None), axis=1)

【讨论】:

    【解决方案2】:

    您不需要使用 lambda 函数。避免循环并使用locstr.contains

    df = pd.DataFrame({'A': [';', '', 'M;', 'M', ';M', 'M;M', ';;M']})
    df.loc[df['A'].str.contains('M'), 'B'] = 'M'
    
         A    B
    0    ;  NaN
    1       NaN
    2   M;    M
    3    M    M
    4   ;M    M
    5  M;M    M
    6  ;;M    M
    

    【讨论】:

      【解决方案3】:

      添加参数axis,否则该函数将应用于每一列。 这将使代码如下:

      df["B"] = df.apply(lambda x: 'M' if ('M' in x['A']) else None ,axis=1)
      

      【讨论】:

      • 这并不是真正需要的,因为她在“A”列上运行apply。另一方面,包围if 表达式的括号是多余的。
      猜你喜欢
      • 2017-03-05
      • 2021-07-15
      • 2018-05-12
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2018-10-10
      相关资源
      最近更新 更多