为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2023-10-18 21:29:34
有一个值列表weather = ['cloudy', 'sunny']我有一个带有旧列“天气”的数据框。我们切换到 2 个带有布尔值的新列,因此需要考虑所有旧列。现在这是我的数据框:[In]data = [['cloudy', False, False], ['sunny', False, False]]df = pd.DataFrame(data, columns=['old', 'cloudbool', 'sunbool'])df[Out]     old  cloudbool sunbool0   cloudy  False   False1   sunny   False   False期望的输出:[In]data = [['cloudy', True, False], ['sunny', False, True]]df = pd.DataFrame(data, columns=['old', 'cloudbool', 'sunbool'])[Out]    old   cloudbool sunbool0   cloudy  True    False1   sunny   False   True我知道我可以做类似下面的事情,但我有一个“天气类型”列表,比 2 长得多。df.loc[df['old'] == 'cloudy', ['cloudbool']] = True我希望我正确地传达了这一点。谢谢
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

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


查看完整回答
反对 回复 2023-10-18
?
SMILET

TA贡献1796条经验 获得超4个赞

我知道该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)

df1

Out[1]: 

      old  cloudbool  sunbool

0  cloudy       True    False

1   sunny      False     True


查看完整回答
反对 回复 2023-10-18
  • 2 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信