【问题标题】:create new pandas dataframe column based on if-else condition with a lookup基于 if-else 条件和查找创建新的 pandas 数据框列
【发布时间】:2016-11-24 21:30:01
【问题描述】:

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

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

考虑以下数据框df

letters
A
B
C
D
E
F

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

lookup = [C,D]

现在,我想在我的数据框中创建一个包含 1 的新列,如果相应的值包含在 lookup0 中,如果值不在 lookup 中。

典型的方法是:

df.apply(helper, axis=1)

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

但是,我不知道如何才能访问 lookup 中的 helper() 而不使其成为全局。

结果应该是这样的:

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

【问题讨论】:

  • 这个和这个很相似:stackoverflow.com/questions/38499890/…你只需要做df.loc[df['letters'].isin(lookup),'result'] = 1
  • 或者更完整的是df['result'] = np.where(df['letters'].isin(lookup), 1, 0)

标签: python pandas conditional conditional-statements


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多