【问题标题】:Change multiple boolean columns' values based on a different columns values, using a list使用列表根据不同的列值更改多个布尔列的值
【发布时间】:2021-01-24 03:33:32
【问题描述】:

有一个值列表

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

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

【问题讨论】:

    标签: python pandas list boolean


    【解决方案1】:

    让我们尝试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
    

    【讨论】:

      【解决方案2】:
      1. 我知道get_dummies 方法是为此而构建的,但另一种方法是从列表理解中创建一个系列,将old 列中的天气值与bool 列名称进行比较(假设它们已经存在,如您的示例中一样)。然后,将其转换为列表,以准备将其添加到 datframe。
      2. 您没有直接匹配的名称,所以我省略了最后两个字符,例如cloudy 将是 clousunny 将是 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
      

      【讨论】:

        猜你喜欢
        • 2013-09-11
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 2022-01-11
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多