【问题标题】:Creating multiple boolean columns in pandas based on two conditions根据两个条件在 pandas 中创建多个布尔列
【发布时间】:2022-01-22 08:29:25
【问题描述】:

我问了this question,得到了很大的帮助。 我有一个包含多列和 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

【问题讨论】:

  • If_1st_2021 来自哪里?排名列中是否存在您刚刚未显示的 2021 值?
  • @richardec,正确,我添加了一行

标签: python pandas boolean


【解决方案1】:

这一次,我认为一个很酷的解决方案是将RankYear 列组合起来,然后使用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

【讨论】:

  • @Anakin 如果您想添加更多排名,例如3,只需将它们添加到.map()调用;)
【解决方案2】:

你可以使用:

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

【讨论】:

  • 谢谢,但我不需要排名 1 或 2 之外的任何东西。不需要 3。我的排名高达 100,我只对 8 个布尔列感兴趣(每 4 年 2 个)
  • 你可以在crsstab之后添加这个df_new = df_new[[1,2]]
猜你喜欢
  • 2022-01-15
  • 2019-08-25
  • 1970-01-01
  • 2020-11-21
  • 2018-04-28
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多