根据其他列中的值对列中数据框行的子集应用函数

Ale*_*lex 2 python dataframe pandas

熊猫新手,请耐心等待。

我有一个文本处理函数,我想在我的 datafame 中的一列上运行,条件是另一列中的值。我见过

根据是否标记某些内容,我想对其运行翻译功能。

   account  article    ... translation  flag
0    123      text      ...               1
1    123      text      ...               0
2    123      text      ...               1
Run Code Online (Sandbox Code Playgroud)

我试过:

df['translation'] = df[['flag', 'text']].apply(lambda x: translate(['article']) if ['flag'] == 1 else None)

并得到这个回报:

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index flag')
Run Code Online (Sandbox Code Playgroud)

任何帮助或指导将不胜感激。

Val*_*_Bo 6

我使用了一个类似于你的测试 DataFrame,没有翻译栏:

   account article  flag
0      123   text1     1
1      123   text2     0
2      123   text3     1
Run Code Online (Sandbox Code Playgroud)

然后我定义了一个“代理”翻译函数:

def translate(txt):
    return '_' + txt + '_'
Run Code Online (Sandbox Code Playgroud)

并有条件地调用它,运行:

df['translation'] = df.apply(lambda row:
    translate(row.article) if row.flag == 1 else None, axis=1)
Run Code Online (Sandbox Code Playgroud)

结果是:

   account article  flag translation
0      123   text1     1     _text1_
1      123   text2     0        None
2      123   text3     1     _text3_
Run Code Online (Sandbox Code Playgroud)

你的代码有什么问题:

  1. 如果要将源数据限制为列的子集,请使用现有 列名(article而不是text)并包括应用函数中使用的所有列。

  2. lambda 函数应用于每一,因此您应该传递 axis=1参数(默认0)。

  3. 当您的函数被调用时,当前作为参数 ( x )传递,但要引用其中的某些列,您应该使用x.column_name 表示法。例如,我的解决方案也可以是:

     df[['article', 'flag']].apply(lambda row:
         translate(row.article) if row.flag == 1 else None, axis=1)
    
    Run Code Online (Sandbox Code Playgroud)
  4. ['article']这样的参数在这里只是一个列表,包含一个词(article)。我怀疑您的翻译功能是否能够处理列表参数。

  5. 关于if ['flag'] ... 的类似评论。这不是对源行中的列的引用。