python - 通过查找基于 if-else 条件创建新的 pandas 数据框列

标签 python pandas conditional-statements

我有一个 pandas 数据框,我需要根据 if-else 条件创建一个新列。这个问题已经在这里多次出现(例如 Creating a new column based on if-elif-else condition )。

但是,我无法应用建议的解决方案,因为我还需要查找列表中的值以检查条件。我无法使用建议的解决方案执行此操作,因为我不确定如何在外部函数中访问我的查找列表。我的查找列表需要是全局的,我想避免这种情况。我感觉应该有更好的方法来做到这一点。

考虑以下数据帧df:

letters
A
B
C
D
E
F

我还有一个包含查找值的列表:

lookup = [C,D]

现在,我想在我的数据框中创建一个新列,如果相应的值包含在 lookup 中,则该列包含 1 ;如果 lookup 中包含该值,则该列包含 0这些值不在查找中。

典型的方法是:

df.apply(helper, axis=1)

def helper(row):
  if(row['letters'].isin(lookup)):
     row['result'] = 1
  else:
     row['result'] = 0

但是,我不知道如何在 helper() 中访问 lookup 而不将其设为全局。

结果应如下所示:

letters    result
A          0
B          0
C          1
D          1
E          0
F          0

最佳答案

虽然这个问题与问题非常相似:How to use pandas apply function on all columns of some rows of data frame

我认为这里值得展示几个方法,在一行中使用 np.where 以及从 isin 生成的 bool 掩码,isin 将返回一个 bool 系列,其中任何行都包含列表中的任何匹配项:

In [71]:
lookup = ['C','D']
df['result'] = np.where(df['letters'].isin(lookup), 1, 0)
df

Out[71]:
  letters  result
0       A       0
1       B       0
2       C       1
3       D       1
4       E       0
5       F       0

此处使用 2 个 loc 语句并使用 ~ 反转掩码:

In [72]:
df.loc[df['letters'].isin(lookup),'result'] = 1
df.loc[~df['letters'].isin(lookup),'result'] = 0
df

Out[72]:
  letters  result
0       A       0
1       B       0
2       C       1
3       D       1
4       E       0
5       F       0

关于python - 通过查找基于 if-else 条件创建新的 pandas 数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38501685/

相关文章:

php - 如何检查三个变量中是否只有一个不为空?

python - 对数据框的交替列求和

python - 如何标准化直方图

python - 如何使用 SQLAlchemy 强制创建 backref InstrumentedAttributes

python - Pandas:计算数据帧每列的一组n个值的平均值

python - 时间序列数据集将数据拆分为大小相等的 block

Python 和 Snowflake 在追加到云上的现有表时出现错误

python - 试图用 pandas 子集替换 open(),但出现 __exit__ 错误?

php - Join 函数用于将一个表中的字段值与另一表中的字段值进行匹配

java - 没有索引声明的 for 循环