【问题标题】:create another column with 1 and 0 using np.where, on a series of multiple values使用 np.where 在一系列多个值上创建具有 1 和 0 的另一列
【发布时间】:2016-09-20 02:18:14
【问题描述】:

您好,我正在尝试创建一个列。 如果 ChannelID 列是“J”、“F”、“H”,那么列名间接应该是 1 否则为 0,我相信我的 csv 文件中 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 列中每个单元格中的值后面都有空格,因此我使用条带将其删除,然后我得到以下错误-

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'

非常感谢,

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

【问题讨论】:

    标签: python numpy pandas dataframe series


    【解决方案1】:

    将列表传递给isin 并使用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 对数据进行预处理,以去除空格并将字符串大写。

    【讨论】:

    • 如果数据中有空格可以使用df['Channel'].str.strip().isin(['J','F','H'])
    • 是的,另外一个人可以做.str.upper也更安全
    • df['Channel'].str.strip().isin(['J','F','H']) 给出 True 和 False 而不是 1 和 0
    • @SanchitAluna .astype(int)
    • @SanchitAluna 你看到我答案上半部分的输出了吗?
    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多