【问题标题】:Returning "yes" in one column if it contains a string in another column [duplicate]如果在一列中包含另一列中的字符串,则在另一列中返回“是”[重复]
【发布时间】:2019-08-01 22:50:15
【问题描述】:

如果盒子的考试包含在Exams for this Site 中,我想创建一个列Valid Site

由于某种原因,我目前对Valid Site 的方法给了我不准确的值:

>>> Materials_Tracking_df

+--------+--------------------+-----------------------+--------------+
| EXAM   | Scoring Site DBN   | Exams for this Site   | Valid Site   |
|--------+--------------------+-----------------------+--------------|
| MXRC   | 04M435             | MXRC, MXRK, MXRN,     | N            |
| MXRC   | 04M435             | MXRC, MXRK, MXRN,     | N            |
| SXRK   | 03M076             | SXRK, SXRU,           | N            |
| MXRC   | 04M435             | MXRC, MXRK, MXRN,     | N            |
+--------+--------------------+-----------------------+--------------+

看看第一行如何,它说 MXRC 是 N 对应于 Valid Site,尽管它显然在 Exams for this Site 之下。

这是我正在使用的代码:

MaterialsTracking_df['Valid Site'] = "Y" if MaterialsTracking_df['EXAM'].to_string() in MaterialsTracking_df['Exams for this Site'].to_string() else "N"

【问题讨论】:

  • 您能否向我们展示您的数据结构是什么样的:MaterialsTracking_df。否则我们无法回答这个问题。需要知道例如:Exams for this Site 是元组还是字符串等。
  • 当前返回值是多少?这些信息是从哪里来的?你如何获得信息?请发布更多代码,以便我们复制您的结果:)
  • 你为什么使用Series.to_string()?这不会像你认为的那样做。在 Python 控制台中试用 MaterialsTracking_df['EXAM'].to_string()MaterialsTracking_df['Exams for this Site'].to_string()
  • MaterialsTracking_df['Valid Site'] = ["Y" if exam in exams else "N" for exam, exams in zip(MaterialsTracking_df['EXAM'], MaterialsTracking_df['Exams for this Site'])],前提是没有包含 N/A 值的行。

标签: python pandas


【解决方案1】:
MaterialsTracking_df['Valid Site'] = "Y" if ...

所有行赋值。

改用 pandas.DataFrame.apply https://pandas.pydata.org/pandas-docs/version/0.24.2/reference/api/pandas.DataFrame.apply.html

示例(我添加了另一个不满足条件的虚拟行):

import pandas as pd
from io import StringIO

Materials_Tracking_df = pd.read_csv(StringIO("""
EXAM;Scoring Site DBN;Exams for this Site
MXRC;04M435;MXRC, MXRK, MXRN
MXRC;04M435;MXRC, MXRK, MXRN
SXRK;03M076;SXRK, SXRU
MXRC;04M435;MXRC, MXRK, MXRN
SXRK;04____;MXRC, MXRK, MXRN
"""), sep=';')

Materials_Tracking_df['Valid Site'] = Materials_Tracking_df.apply(
    lambda r: 'T' if r['EXAM'] in r['Exams for this Site'] else 'N'
, axis=1)

   EXAM Scoring Site DBN Exams for this Site Valid Site
0  MXRC           04M435    MXRC, MXRK, MXRN          T
1  MXRC           04M435    MXRC, MXRK, MXRN          T
2  SXRK           03M076          SXRK, SXRU          T
3  MXRC           04M435    MXRC, MXRK, MXRN          T
4  SXRK           04____    MXRC, MXRK, MXRN          N

【讨论】:

  • 谢谢拉斐尔。在哪里可以找到有关此语法 r['EXAM'] 的更多文档,或者通过将 lambda 变量直接放在列的前面来使用列的单个实例?
  • pandas的文档其实不是很清楚。如果您将 apply 与 axis=1 一起使用,则为每一行调用您的函数(或 lambda 表达式)。您可以像字典一样访问该行的列/值(例如 r['EXAM'])。也许这会有所帮助:thispointer.com/…
猜你喜欢
  • 1970-01-01
  • 2018-12-05
  • 2019-05-26
  • 2018-05-21
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
相关资源
最近更新 更多