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

Change multiple boolean columns' values based on a different columns values, using a list

有一个值列表

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

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

让我们尝试 str.get_dummies 创建虚拟指标变量,然后 join 使用原始数据框:

df[['old']].join(df['old'].str.get_dummies().astype(bool).add_suffix('bool'))

      old  cloudybool  sunnybool
0  cloudy        True      False
1   sunny       False       True
  1. 我知道 get_dummies 方法是为此构建的,但另一种方法是通过列表理解创建一个系列,将 old 列中的天气值与您的bool 列名称(假设它们已经存在,如您的示例所示)。然后,将其隐藏到列表中,为将其添加到数据帧做准备。
  2. 你的名字没有直接匹配,所以我省略了最后两个字符,例如cloudy 将是 clou,而 sunny 将是 sun。我不认为任何天气的后缀都大于 2 个字符?同样,这就是为什么它不像 get_dummies 那样健壮。您还可以使您的列名与您的值相匹配,例如cloudyboolsunnybool:

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)
df1
Out[1]: 
      old  cloudbool  sunbool
0  cloudy       True    False
1   sunny      False     True