Pandas - 按键

时间:2018-02-20 09:26:10

标签: python python-3.x pandas dataframe

我有一个DataFrame Pandas,我希望通过A,B,C和D列的组合尽可能地按数据分组。

我们说它有这种形式:

      A   B   C   D   E   F   G        
0     Y   X   Y   Z   1   2   7
1     Y   X   Y   Z   3   4   8 
2     X   Y   U   V   1   1   1
3     X   Y   V   U   1   2   0
4     X   Z   Z   Z   1   8   1

首先,我尝试在更高级别进行分组,因此我尝试按[' A',' B',' C',&#进行分组39; d&#39]。对于尚未重新组合的行,我尝试较低的组合,例如[' A',' B'' C'],[&#39 ; A',' B',' D'],依此类推。最后我没有使用任何组合,只是按[' A']然后[' B']然后[' C']然后[' D&# 39]。此时,我将数据与每个可能的聚合键分组,这意味着A,B,C和D.

使用此方法,所需的输出将是:

      A   B   C   D           
0     Y   X   Y   Z    
1     X   Y     
2     X   

是否可以轻松完成这些操作?

1 个答案:

答案 0 :(得分:2)

我认为您首先需要列值的所有组合:

df = pd.DataFrame({'A':[5,3,6,9,2,4],
                   'B':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   })

print (df)
   A  B  C  D
0  5  4  7  1
1  3  5  8  3
2  6  4  9  5
3  9  5  4  7
4  2  5  2  1
5  4  4  3  0

from  itertools import combinations
a = df.columns
comb = [j for i in range(len(a), 0, -1) for j in combinations(a,i)]
print (comb)
[('A', 'B', 'C', 'D'),
 ('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D'), 
 ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D'), 
('A',), ('B',), ('C',), ('D',)]

a = pd.concat([df.loc[:, x].sum(axis=1) for x in comb], axis=1)
print (a)
   0   1   2   3   4   5   6   7   8   9   10  11  12  13  14
0  17  16  10  13  12   9  12   6  11   5   8   5   4   7   1
1  19  16  11  14  16   8  11   6  13   8  11   3   5   8   3
2  24  19  15  20  18  10  15  11  13   9  14   6   4   9   5
3  25  18  21  20  16  14  13  16   9  12  11   9   5   4   7
4  10   9   8   5   8   7   4   3   7   6   3   2   5   2   1
5  11  11   8   7   7   8   7   4   7   4   3   4   4   3   0

然后通过duplicated获取concat的所有重复项,并numpy.argmax获取最新True

print (pd.concat([df.duplicated(x, keep=False) for x in comb], axis=1))

      0      1      2      3      4      5      6      7      8      9   \
0   True   True   True   True   True   True   True   True   True   True   
1   True   True   True   True   True   True   True   True   True   True   
2  False  False  False  False  False   True  False  False  False  False   
3  False  False  False  False  False   True  False  False  False  False   
4  False  False  False  False  False  False  False  False  False  False   

      10    11     12     13     14  
0   True  True   True   True   True  
1   True  True   True   True   True  
2  False  True   True  False  False  
3  False  True   True  False  False  
4  False  True  False  False   True  

a = pd.concat([df.duplicated(x, keep=False) for x in comb], axis=1).values.argmax(axis=1)
print (a)
[ 0  0  5  5 11]

最后使用此数组作为groupby的参数:

df = df.groupby(a).sum()
print (df)
    E  F   G
0   4  6  15
5   2  3   1
11  1  8   1