繁体   English   中英

Lambda函数中的列表理解问题

[英]Issues with list comprehension in Lambda function

我正在尝试在以下应用中构建lambda函数:

  • 检查输入的列表是否在另一个列表内
  • 如果存在,则将值附加到同一数据框中的另一列

例:

初始数据框:

id list_1 list_2
1 [1,2,3] []
2 [1,2,4] []
3 [1,3,4] []

现在,我要检查list_1是否存在[1,2] 如果是这样, list_2 test附加到list_2列表。

final_dataframe:

id list_1 list_2
1 [1,2,3] ['test']
2 [1,2,4] ['test']
3 [1,3,4] []

这是我的第一次尝试:

df.apply(lambda row: row['list_2'].append(['test' if all(elem in [1,2] for elem in row['list_1'])]), axis = 1)

但是我收到了invalid systax错误。 我觉得这可能很简单,但我无法弄清楚问题所在

这是完整的错误:

  File "<ipython-input-126-f45b74393598>", line 3
    movies_test.apply(lambda row: row['displayable'].append(['comedy_drama' if all(elem in ['comedy','drama'] for elem in row['test'])]), axis = 1)
                                                                                                                                      ^
SyntaxError: invalid syntax

您正在使用表达式(lambda仅可容纳一个表达式),因此必须使用条件表达式 表达式总是产生一个对象,因此条件表达式必须具有以下形式的表达式和表达式

<true> if <condition> else <false>`

您省略了else <false>部分。

您正在犯另外三个错误:

  • 您将单列视为列表列表
  • 您要附上您的测试是否正确
  • 您要将列表追加到列表中,而您想在其中追加字符串。

您的测试应该只查看两个元素是否都在列表中; 您可以使用设置操作; 您想知道{1, 2}是否为列值子集

{1, 2}.issubset(row['list_1'])

并且仅将内容追加到另一列,因此仅在以上条件为true时,您才想执行row['list_2'].append() 而且您想附加单个字符串,因此调用.append('test')

对于else部分,您可以返回None ,所以不要进行追加调用:

row['list_2'].append('test') if {1, 2}.issubset(row['list_1']) else None

或者,在df.apply()调用df.apply()

df.apply(lambda row: row['list_2'].append('test') if {1, 2}.issubset(row['list_1']) else None)

但是,如果只使用apply()返回一个布尔值会更好,因此可以选择带有它的行,然后使用单独的操作将其附加到所选的行上:

test = df.list_1.apply(lambda c: {1, 2}.issubset(c))
df.list_2[test].apply(lambda c: c.append('test'))

在这里, test拥有一系列布尔FalseTrue值,与list_1值为{1, 2}的超集的行相对应。 该系列可用于选择df.list_2行,您可以在其中执行其他操作,包括在每个单元格中追加到列表对象。

如果您要从追加到嵌套列表对象切换为仅分配不同的值,那么它更具可读性,更容易更改。 例如,当子集测试通过时,将df.outcome列设置为'tested' ,否则,使用numpy.where()'failed'

test = df.list_1.apply(lambda c: {1, 2}.issubset(c))
df.outcome = np.where(test, 'tested', 'failed')

这个:

['test' if all(elem in [1,2] for elem in row['list_1'])]

是不完整的三元表达式。 语法应为:

a if condition else b

你有

a if condition

这应该给您您想要的结果。 您的列表理解似乎缺少一些括号。

mask = [key for key, value in df['list_1'].items() if 1 in value and 2 in value]
df.loc[mask]['list_2'].apply(lambda x: x.append('test_2'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM