【问题标题】:Creating a new column using string match and based on if-else condition使用字符串匹配并基于 if-else 条件创建新列
【发布时间】:2021-12-30 22:44:48
【问题描述】:

我有一个数据框,其中包含来自 OCR 的文本输出的“url_text”列。我正在尝试创建一个新列“阻塞”,如果满足条件,则行等于 1,否则为 0。

df[df['url_text'].str.contains('blocked you')] # detect all rows in 'url_text' column 
# that contain 'blocked you'. Code works.  

我已经尝试在下面的函数中插入上面的代码。但是,当我将该函数应用于我的数据框时,我收到以下错误:

def f(row):
    if row['url_text'] == df[df['url_text'].str.contains('blocked you')]:
        val = 1
    else:
        val = 0
    return val
df['blocked'] = df.apply(f)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/frame.py", line 8740, in apply
    return op.apply()
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/apply.py", line 688, in apply
    return self.apply_standard()
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/apply.py", line 812, in apply_standard
    results, res_index = self.apply_series_generator()
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/apply.py", line 828, in apply_series_generator
    results[i] = self.f(v)
  File "<input>", line 3, in f
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/series.py", line 942, in __getitem__
    return self._get_value(key)
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/series.py", line 1051, in _get_value
    loc = self.index.get_loc(label)
  File "/Users/marcoliedecke/Desktop/Who_Blocks_Who?/Code/venv/lib/python3.9/site-packages/pandas/core/indexes/range.py", line 388, in get_loc
    raise KeyError(key)
KeyError: 'url_text'

【问题讨论】:

    标签: python pandas if-statement conditional-statements


    【解决方案1】:

    这里的根本问题是您的代码将单个字符串 (row['url_text']) 与数据帧 (df[df...]) 进行比较

    不要在函数中引用df,只需使用在行本身上定义的方法。您也可以将其实现为更接近canonical examples 的 lambda 函数。

    df['blocked'] = df.apply(
        lambda row: 1 if 'blocked you' in row['url_text'] else 0,
        axis=1
    )
    

    【讨论】:

    • 谢谢@Sarah。你的评论很有道理。但是,在执行您的代码时,我收到错误消息SyntaxError: positional argument follows keyword argument
    • @MarcoLiedecke 我的错。我交换了输入的顺序。我会更新我的答案。请使用更新后的订单再试一次。
    • 感谢您抽出宝贵时间@Sarah。您更新的代码给了我以下错误:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
    • @MarcoLiedecke 这就是我没有测试就给出建议的结果。请再试一次
    猜你喜欢
    • 1970-01-01
    • 2014-05-20
    • 2013-12-19
    • 1970-01-01
    • 2016-11-24
    • 2019-06-05
    • 2014-03-09
    • 2018-04-18
    相关资源
    最近更新 更多