根据两个条件在 pandas 中创建多个布尔列
Creating multiple boolean columns in pandas based on two conditions
我问了,得到了很大的帮助。
我有一个包含多列和 4 年数据的数据框,并且只对排名 1 或 2 感兴趣。
Name Rank Year
Joe 1 2019
Ben 2 2018
Jo 3 2020
Bo 1 2018
Boo 1 2021
如果一个名字在特定年份有 1 或 2 个排名,我想创建一个相关的布尔列
预期输出
Name Rank Year If_1st_2018 If_1st_2019 If_1st_first_2020 If_1st_2021 If_2nd_2018 If_2nd_2019 etc
Joe 1 2019 0 1 0 0 0 0
Ben 2 2018 0 0 0 0 1 0
Jo 3 2020 0 0 0 0 0 0
Bo 1 2018 1 0 0 0 0 0
Boo 1 2021 0 0 0 1 0 0
您可以使用:
df_new = pd.crosstab(df['Name'], [df['Rank'], df['Year']], dropna=False)
df_new = df_new[[1,2]]
df_new.columns = ['_'.join(map(str, x)) for x in df_new.columns]
df_new.reset_index(inplace=True)
df = df.merge(df_new, how='left', on=['Name'])
print(df)
OUTPUT
Name Rank Year 1_2018 1_2019 1_2020 2_2018 2_2019 2_2020
0 Joe 1 2019 0 1 0 0 0 0
1 Ben 2 2018 0 0 0 1 0 0
2 Jo 3 2020 0 0 0 0 0 0
3 Bo 1 2018 1 0 0 0 0 0
这一次,我认为一个很酷的解决方案是合并 Rank
和 Year
列,然后使用 pd.get_dummies
:
df = pd.concat([df, pd.get_dummies('If_' + df['Rank'].map({1: '1st', 2: '2nd'}) + '_' + df['Year'].astype(str))], axis=1)
输出:
>>> df
Name Rank Year If_1st_2018 If_1st_2019 If_1st_2021 If_2nd_2018
0 Joe 1 2019 0 1 0 0
1 Ben 2 2018 0 0 0 1
2 Jo 3 2020 0 0 0 0
3 Bo 1 2018 1 0 0 0
4 Boo 1 2021 0 0 1 0
我问了
Name Rank Year
Joe 1 2019
Ben 2 2018
Jo 3 2020
Bo 1 2018
Boo 1 2021
如果一个名字在特定年份有 1 或 2 个排名,我想创建一个相关的布尔列
预期输出
Name Rank Year If_1st_2018 If_1st_2019 If_1st_first_2020 If_1st_2021 If_2nd_2018 If_2nd_2019 etc
Joe 1 2019 0 1 0 0 0 0
Ben 2 2018 0 0 0 0 1 0
Jo 3 2020 0 0 0 0 0 0
Bo 1 2018 1 0 0 0 0 0
Boo 1 2021 0 0 0 1 0 0
您可以使用:
df_new = pd.crosstab(df['Name'], [df['Rank'], df['Year']], dropna=False)
df_new = df_new[[1,2]]
df_new.columns = ['_'.join(map(str, x)) for x in df_new.columns]
df_new.reset_index(inplace=True)
df = df.merge(df_new, how='left', on=['Name'])
print(df)
OUTPUT
Name Rank Year 1_2018 1_2019 1_2020 2_2018 2_2019 2_2020
0 Joe 1 2019 0 1 0 0 0 0
1 Ben 2 2018 0 0 0 1 0 0
2 Jo 3 2020 0 0 0 0 0 0
3 Bo 1 2018 1 0 0 0 0 0
这一次,我认为一个很酷的解决方案是合并 Rank
和 Year
列,然后使用 pd.get_dummies
:
df = pd.concat([df, pd.get_dummies('If_' + df['Rank'].map({1: '1st', 2: '2nd'}) + '_' + df['Year'].astype(str))], axis=1)
输出:
>>> df
Name Rank Year If_1st_2018 If_1st_2019 If_1st_2021 If_2nd_2018
0 Joe 1 2019 0 1 0 0
1 Ben 2 2018 0 0 0 1
2 Jo 3 2020 0 0 0 0
3 Bo 1 2018 1 0 0 0
4 Boo 1 2021 0 0 1 0