python - Pandas - 按每个可能的键组合聚合

标签 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', 'D'] 进行分组。对于尚未重新分组的行,我尝试使用较低的组合,例如 ['A'、'B'、'C']、['A'、'B'、'D'] 等。最后我没有使用任何组合,只是按 ['A'] 然后 ['B'] 然后 ['C'] 然后 ['D'] 分组。此时,我已将数据分组,每个可能的聚合键暗示 A、B、C 和 D。

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

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

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

最佳答案

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

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

关于python - Pandas - 按每个可能的键组合聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48881766/

相关文章:

python - Pandas 找到至少两组中存在的值

python - 提高 Pandas 数据透视表中的调和平均效率

python - 使用字典列表值选择 pandas 数据框的列

python - 在 Python 中拆分 Dataframe 列

python - 如何将Pandas read_xml设置为特定节点?

python - 我如何为 namedtuple(使用 autodoc)提供 Sphinx 文档?

python - tensorflow 随机洗牌队列: insufficient elements

python - C++ 中超出了内存限制,但 Python 中未超出内存限制

python - PyQt5 动画行为作为类属性

python - 按关键字重命名 Pandas 中的多列