使用 np.where 在一系列多个值上创建另一个包含 1 和 0 的列

create another column with 1 and 0 using np.where, on a series of multiple values

您好,我正在尝试创建一个专栏。 如果列 ChannelID 是 'J','F','H' 那么间接列名应该是 1 否则 0,我相信我的 csv 文件中的每个单元格中都有 spaces ChannelID 列。

原始数据

cd          Channel month
B               J   1
B               J   3
B               M   5
B               J   7
B               J   9
B               H   2
B               J   5
B               J   6
B               J   1
B               J   7

预期数据集

cd         Channel  month   Indirect
B               J   1   1
B               J   3   1
B               M   5   0
B               J   7   1
B               J   9   1
B               H   2   1
B               J   5   1
B               J   6   1
B               C   1   0
B               J   7   1

使用代码

Output['Indirect']=np.where((Output['Channel']=='J')|(Output['Channel']=='H'),1,0)

但是此代码在间接列中仅给出 0,如果我使用以下代码,则会出现错误-

if Output['Channel']== ('J' or 'F' or 'H' or 'G' or 'I'or 'K' or 'M'):
    Output['Indirect'] = 1
else:
    Output['Indirect'] = 0

error- ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

因为 Channel 列中每个单元格中的值后有 space 然后我使用 strip 删除它然后我得到低于错误 -

if Output['Channel'].strip()== ('J' or 'F' or 'H' or 'G' or 'I'or 'K' or 'M'):
    Output['Indirect'] = 1
else:
    Output['Indirect'] = 0

error- AttributeError: 'Series' 对象没有属性 'strip'

非常感谢,

我还附上了每个单元格中 space 的屏幕截图

将列表传递给 isin and cast the boolean type using astype:

In [4]:
df['indirect'] = df['Channel'].str.strip().isin(['J','F','H']).astype(int)
df

Out[4]:
  cd Channel  month  indirect
0  B       J      1         1
1  B       J      3         1
2  B       M      5         0
3  B       J      7         1
4  B       J      9         1
5  B       H      2         1
6  B       J      5         1
7  B       J      6         1
8  B       J      1         1
9  B       J      7         1

这是从 isin 生成的布尔系列:

In [5]:
df['Channel'].str.strip().isin(['J','F','H'])

Out[5]:
0     True
1     True
2    False
3     True
4     True
5     True
6     True
7     True
8     True
9     True
Name: Channel, dtype: bool

如果需要,您可以使用矢量化 str.stripstr.upper 预处理数据,以去除空格并将字符串大写。