使用列表根据不同的列值更改多个布尔列的值

有一个值列表


weather = ['cloudy', 'sunny']

我有一个带有旧列“天气”的数据框。我们切换到 2 个带有布尔值的新列,因此需要考虑所有旧列。


现在这是我的数据框:


[In]

data = [['cloudy', False, False], ['sunny', False, False]]

df = pd.DataFrame(data, columns=['old', 'cloudbool', 'sunbool'])

df

[Out]

     old  cloudbool sunbool

0   cloudy  False   False

1   sunny   False   False

期望的输出:


[In]

data = [['cloudy', True, False], ['sunny', False, True]]

df = pd.DataFrame(data, columns=['old', 'cloudbool', 'sunbool'])

[Out]

    old   cloudbool sunbool

0   cloudy  True    False

1   sunny   False   True

我知道我可以做类似下面的事情,但我有一个“天气类型”列表,比 2 长得多。


df.loc[df['old'] == 'cloudy', ['cloudbool']] = True

我希望我正确地传达了这一点。谢谢


跃然一笑
浏览 63回答 2
2回答

largeQ

让我们尝试str.get_dummies创建虚拟指标变量,然后join使用原始数据帧:df[['old']].join(df['old'].str.get_dummies().astype(bool).add_suffix('bool'))      old  cloudybool  sunnybool0  cloudy        True      False1   sunny       False       True

SMILET

我知道该get_dummies方法是为此构建的,但另一种方法是从列表理解创建一系列,将列中的天气值old与bool列名称进行比较(假设它们已经存在,如您的示例中所示)。然后,将其隐藏到列表中,准备将其添加到数据框中。您的名称没有直接匹配,因此我省略了最后两个字符,例如cloudywill beclou和sunnywill be sun。我认为任何天气的后缀都不可能超过 2 个字符?这也是为什么它不像get_dummies. 您还可以使列名称与您的值匹配,例如cloudybool和sunnybool:s = df.apply(lambda x: [x['old'][:-2] in col for col in df.columns[1:]], axis=1).to_list()df1 = pd.concat([df['old'],pd.DataFrame(s, columns=df.columns[1:])], axis=1)df1Out[1]:       old  cloudbool  sunbool0  cloudy       True    False1   sunny      False     True
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python