在python中检查df中每一行的每一列值

2024-06-01 09:12:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉熊猫数据帧。所以,我在这方面需要帮助 我的df如下所述:

  Location      A      B      C      D
0        X  GREEN    RED  GREEN  AMBER
1        Y  GREEN    RED    RED    RED
2        Z  GREEN  GREEN  GREEN  GREEN
3        R  GREEN  GREEN  GREEN  GREEN 

我想要数据框中每一行和每一列的状态列。状态列基于列A、B、C和D。如果行中的任何列值为红色,则状态为红色。否则,如果任何列值为琥珀色,则状态为琥珀色,否则为绿色

对于每列,当该列中的任何值为红色时,输出将为红色。否则,如果任何列值为琥珀色,则该值为琥珀色。否则列值将为绿色

输出应该是这样的

  Location      A      B      C      D  Status
0        X  GREEN    RED  GREEN  AMBER     RED
1        Y  GREEN    RED    RED    RED     RED
2        Z  GREEN  GREEN  GREEN  GREEN   AMBER
3        R  GREEN  GREEN  GREEN  GREEN   GREEN
            GREEN    RED    RED    RED

Tags: 数据df状态statuslocationgreenred绿色
3条回答

您可以使用:

def set_status(row):
  condition = [row['A'], row['B'], row['C'], row['D']]
  if 'RED' in condition:
    return 'RED'
  elif 'AMBER' in condition:
    return 'AMBER'
  else:
    return 'GREEN'

df['Status'] = df.apply(set_status, axis=1)

其思想是创建优先级值列表,通过^{}重塑值,转换为类别,通过^{}排序并获取第一个值:

priority = ['RED','AMBER','GREEN']
c = ['A','B','C','D']
s = df[c].stack()

cats = pd.Categorical(s, ordered=True, categories=priority)
df['Status'] = pd.Series(cats, index=s.index).sort_values().groupby(level=0).first()
print (df)
  Location      A      B      C      D Status
0        X  GREEN    RED  GREEN  AMBER    RED
1        Y  GREEN    RED    RED    RED    RED
2        Z  GREEN  AMBER  GREEN  GREEN  AMBER
3        R  GREEN  GREEN  GREEN  GREEN  GREEN

下面是另一个沿轴1使用^{}^{}^{}的解决方案:

condlist = [
    df.loc[:, 'A':'D'].eq('RED').any(1),
    df.loc[:, 'A':'D'].eq('AMBER').any(1)
]

choicelist = ['RED', 'AMBER']

df['Status'] = np.select(condlist, choicelist, default='GREEN')

[外]

  Location      A      B      C      D Status
0        X  GREEN    RED  GREEN  AMBER    RED
1        Y  GREEN    RED    RED    RED    RED
2        Z  GREEN  GREEN  AMBER  GREEN  AMBER
3        R  GREEN  GREEN  GREEN  GREEN  GREEN

相关问题 更多 >