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

查看 groupby 之后每个 ID 是否存在元素

查看 groupby 之后每个 ID 是否存在元素

郎朗坤 2023-01-04 10:28:02
这是我的数据框:       ID  Color 0       1   red    1       1   blue2       1   yellow3       2   blue4       2   purple5       3   yellow6       3   green我想创建第三列,告诉我每个 ID 是红色还是黄色。如果有红色则第三列将为 1,如果有紫色则第三列将为 0,如果两者都没有则留空。不会有红色和紫色在同一个 ID 中的情况。所以,我的结果 df 应该是这样的:       ID  Color    col30       1   red     11       1   blue    12       1   yellow  13       2   blue    04       2   purple  05       3   yellow  6       3   green我正在考虑对我的 ID 列进行分组,然后检查颜色列中是否存在红色或紫色。我不确定如何实施。请帮忙
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这是使用的一种方法np.select

conds = [df.Color.eq('red'), df.Color.eq('purple')]

df['col3'] = np.select(conds, [1,0], '')

df['col3'] = df.groupby('ID').col3.transform('max')

或者我们可以改为将 a 设置nan为默认值,并使用 进行转换first:


df['col3'] = np.select(conds, [1,0], np.nan)

df['col3'] = df.groupby('ID').col3.transform('first').fillna('')

print(df)


   ID   Color col3

0   1     red    1

1   1    blue    1

2   1  yellow    1

3   2    blue    0

4   2  purple    0

5   3  yellow     

6   3   green     

请注意,前一种方法利用了以下优势:


max('', '0')

# '0'

max('', '1')

# '1'


查看完整回答
反对 回复 2023-01-04
?
慕姐4208626

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

numpy如果您出于任何原因不想使用,这里有一个替代方案:


df['col3'] = df.set_index('ID')['Color'].apply({'red': 1, 'purple': 0}.get).groupby(level=0).transform('max').fillna('').reset_index(drop=True)


   ID   Color col3

0   1     red    1

1   1    blue    1

2   1  yellow    1

3   2    blue    0

4   2  purple    0

5   3  yellow     

6   3   green     


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

添加回答

举报

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