熊猫MultiIndex数据框将最小值和最大值替换为0

时间:2018-08-18 21:15:16

标签: python python-3.x pandas multi-index

我有一个具有multiindex的数据框,并试图找到一种方法来在每个level = 0中用0替换等于min或max的值。例如:

import pandas as pd
import numpy as np

d = {'index0': ['p1', 'p1', 'p1', 'p2', 'p2', 'p2', 'p2', 'p2', 'p3', 'p3', 'p3', 'p3', 'p3'],
'index1': ['u1', 'u2', 'u3', 'u1', 'u2', 'u3', 'u4', 'u5', 'u1', 'u2', 'u3', 'u4', 'u5'],
'data': [2, 16, 49, -67, -57, -30, 14, 76, 52, -26, 38, 79, 65]}

df = pd.DataFrame(data=d)
df = df.set_index(['index0', 'index1'], drop = False)

print(df)

我想要这个数据框:

              index0 index1  data
index0 index1
p1     u1         p1     u1     2
       u2         p1     u2    16
       u3         p1     u3    49
p2     u1         p2     u1   -67
       u2         p2     u2   -57
       u3         p2     u3   -30
       u4         p2     u4    14
       u5         p2     u5    76
p3     u1         p3     u1    52
       u2         p3     u2   -26
       u3         p3     u3    38
       u4         p3     u4    79
       u5         p3     u5    65

获取此内容:

              index0 index1  data
index0 index1
p1     u1         p1     u1     0
       u2         p1     u2    16
       u3         p1     u3     0
p2     u1         p2     u1     0
       u2         p2     u2   -57
       u3         p2     u3   -30
       u4         p2     u4    14
       u5         p2     u5     0
p3     u1         p3     u1    52
       u2         p3     u2     0
       u3         p3     u3    38
       u4         p3     u4     0
       u5         p3     u5    65

我尝试使用类似的示例,但是无法正常工作。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

这两种解决方案请勿使用您的set_index行,因此请确保避免这种情况。

使用groupbyaggjoin

s = df.groupby('index0').data.agg(['min', 'max']).add_prefix('data_')
out = df.set_index('index0').join(s)
out.loc[out.data.eq(out.data_min) | out.data.eq(out.data_max), 'data'] = 0
out = out.drop(['data_min', 'data_max'], 1)

使用np.where

s = df.groupby('index0').data.agg(['min', 'max']).add_prefix('data_')
out = df.set_index('index0').join(s)
df.assign(data=np.where(out.data.eq(out.data_min) | out.data.eq(out.data_max), 0, out.data))

这两种产品都产生:

   index0 index1  data
0      p1     u1     0
1      p1     u2    16
2      p1     u3     0
3      p2     u1     0
4      p2     u2   -57
5      p2     u3   -30
6      p2     u4    14
7      p2     u5     0
8      p3     u1    52
9      p3     u2     0
10     p3     u3    38
11     p3     u4     0
12     p3     u5    65