使用列表根据不同的列值更改多个布尔列的值
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
- 我知道
get_dummies
方法是为此构建的,但另一种方法是通过列表理解创建一个系列,将 old
列中的天气值与您的bool
列名称(假设它们已经存在,如您的示例所示)。然后,将其隐藏到列表中,为将其添加到数据帧做准备。
- 你的名字没有直接匹配,所以我省略了最后两个字符,例如
cloudy
将是 clou
,而 sunny
将是 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
有一个值列表
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
- 我知道
get_dummies
方法是为此构建的,但另一种方法是通过列表理解创建一个系列,将old
列中的天气值与您的bool
列名称(假设它们已经存在,如您的示例所示)。然后,将其隐藏到列表中,为将其添加到数据帧做准备。 - 你的名字没有直接匹配,所以我省略了最后两个字符,例如
cloudy
将是clou
,而sunny
将是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