如何创建指示给定数据帧的行min和max的数据帧?

时间:2017-08-01 08:09:40

标签: python pandas

我需要为自动图表创建过程生成一个矩阵作为条件格式的输入。我的接收同事必须显示数字,并给每行的最大值和最小值一个相关的颜色。对于他的过程,具有指示行分钟和最大值的条目的第二矩阵将是理想的。 那么我需要提供什么?

假设我有以下数据框:

Cat Product Brand1  Brand2  Brand3
A   a   6   9   5
A   b   11  7   7
A   c   9   5   5
B   d   7   3   10
B   e   5   8   8
B   f   10  6   6
C   g   8   4   4
C   h   6   2   9
C   i   4   7   7

由此,我想生成以下数据帧,将“1”表示为行最大值,将“2”表示为行min:

Cat Product Brand1  Brand2  Brand3
A   a   0   1   2
A   b   1   2   2
A   c   1   2   2
B   d   0   2   1
B   e   2   1   1
B   f   1   2   2
C   g   1   2   2
C   h   0   2   1
C   i   2   1   1

指标“1”和“2”可能是其他东西,甚至是字母或其他东西。零也可能是na。

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

您可以使用numpy.where通过eq

创建的掩码替换值
df = df.set_index(['Cat','Product'])
m1 = df.eq(df.max(axis=1), axis=0)
m2 = df.eq(df.min(axis=1), axis=0)
df = pd.DataFrame(np.where(m1, 1, np.where(m2, 2, 0)), index=df.index, columns=df.columns)
df = df.reset_index()
print (df)
  Cat Product  Brand1  Brand2  Brand3
0   A       a       0       1       2
1   A       b       1       2       2
2   A       c       1       2       2
3   B       d       0       2       1
4   B       e       2       1       1
5   B       f       1       2       2
6   C       g       1       2       2
7   C       h       0       2       1
8   C       i       2       1       1

另一种解决方案:

df = df.set_index(['Cat','Product'])
m1 = df.values == df.values.max(axis=1)[:, None]
m2 = df.values == df.values.min(axis=1)[:, None]
df = pd.DataFrame(np.where(m1, 1, np.where(m2, 2, 0)), index=df.index, columns=df.columns)
df = df.reset_index()
print (df)
  Cat Product  Brand1  Brand2  Brand3
0   A       a       0       1       2
1   A       b       1       2       2
2   A       c       1       2       2
3   B       d       0       2       1
4   B       e       2       1       1
5   B       f       1       2       2
6   C       g       1       2       2
7   C       h       0       2       1
8   C       i       2       1       1