通过多列汇总值

时间:2020-08-03 15:43:23

标签: python pandas

我的数据框看起来像这样。

df = pd.DataFrame({
    'ID': [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3],
    'text': ['a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e', 'e', 'e', 'f', 'g']  ,
    'out_text': ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10', 'x11', 'x12', 'x13', 'x14']  ,  
    'Rule_1': ['N', 'N', 'N', 'Y', 'N', 'N', 'N', 'N', 'N', 'N','N', 'N', 'Y', 'Y'],
    'Rule_2': ['Y', 'N', 'N', 'N', 'Y', 'N', 'N', 'N', 'N', 'N','N', 'N', 'Y', 'N'],
    'Rule_3': ['N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N','N', 'N', 'Y', 'Y']})
    ID text out_text Rule_1 Rule_2 Rule_3
0    1    a       x1      N      Y      N
1    1    a       x2      N      N      N
2    1    b       x3      N      N      N
3    1    b       x4      Y      N      N
4    2    c       x5      N      Y      N
5    2    c       x6      N      N      N
6    2    c       x7      N      N      N
7    2    d       x8      N      N      N
8    2    d       x9      N      N      N
9    2    e      x10      N      N      N
10   2    e      x11      N      N      N
11   2    e      x12      N      N      N
12   3    f      x13      Y      Y      Y
13   3    g      x14      Y      N      Y

我必须将Rule_1,Rule_2,Rule_3进行汇总,以便如果ID和Text的组合在这些列中的任何一列中均具有“ Y”,则总体结果为该组合的Y。在我们的示例中,1-a和1-b总体上为Y。 2-d和2-e为'N'。如何汇总多个列?

1 个答案:

答案 0 :(得分:2)

让我们尝试使用max(1)按行汇总规则,然后使用groupyby().any()检查是否有行具有Y

(df[['Rule_1','Rule_2','Rule_3']].eq('Y')
   .max(axis=1)
   .groupby([df['ID'],df['text']])
   .any()
)

输出:

ID  text
1   a        True
    b        True
2   c        True
    d       False
    e       False
3   f        True
    g        True
dtype: bool

或者,如果您想要Y/N,我们可以将max/any更改为max,并放下比较:

(df[['Rule_1','Rule_2','Rule_3']]
   .max(axis=1)
   .groupby([df['ID'],df['text']])
   .max()
)

输出:

ID  text
1   a       Y
    b       Y
2   c       Y
    d       N
    e       N
3   f       Y
    g       Y
dtype: object