Pandas:按行比较数据框中的所有值

moj*_*_28 3 python dataframe pandas

我正在尝试匹配行并将它们聚合在一行中。

例如对于下表,我想聚合前三行,因为它们是相似的。第四个不一样。在我的检查中,对于 col 1 为 B 的任何行,我什么都不做。然后再次聚合最后两行:

|---------------------|------------------|------------------|
|      Col 1          |     Col 2        |       Col 3      |
|---------------------|------------------|------------------|
|        A            |       12st       |        13        |
|---------------------|------------------|------------------|
|        A            |       12st       |        13        |
|---------------------|------------------|------------------|
|        A            |       12st       |        13        |
|---------------------|------------------|------------------|
|        A            |       12st       |        17        |
|---------------------|------------------|------------------|
|        B            |       11aa       |        10        |
|---------------------|------------------|------------------|
|        C            |       10ee       |        10        |
|---------------------|------------------|------------------|
|        C            |       10ee       |        10        |
|---------------------|------------------|------------------|
Run Code Online (Sandbox Code Playgroud)
df = pd.DataFrame({'Col 1': ['A', 'A', 'A','A', 'B', 'C', 'C'],'Col 2': ['12st', '12st', '12st', '12st', '11aa' ,'10ee','10ee'],'Col 3': [13, 13, 13, 17, 10, 10, 10 ]})


Run Code Online (Sandbox Code Playgroud)

我想获得以下输出:

|---------------------|------------------|------------------|---------------|
|      Col 1          |     Col 2        |       Col 3      |    Col 4      |
|---------------------|------------------|------------------|---------------|
|        A            |       12st       |        13        |      3        |
|---------------------|------------------|------------------|---------------|
|        A            |       12st       |        17        |      1        |
|---------------------|------------------|------------------|---------------|
|        B            |       11a        |        10        |      1        |
|---------------------|------------------|------------------|---------------|
|        C            |       10ee       |        10        |      2        |
|---------------------|------------------|------------------|---------------|

Run Code Online (Sandbox Code Playgroud)

我尝试过更简单的东西,比如 df.shift() 但这似乎只适用于特定的列而不是行。另外,我想对不断匹配的行 (i) 迭代执行此操作 (i==i+1==i+2)。

谢谢

Ben*_*n.T 5

我认为groupby.size可以这样做:

print (df.groupby(['Col 1','Col 2', 'Col 3']).size().reset_index(name='Col 4'))
  Col 1 Col 2  Col 3  Col 4
0     A  12st     13      3
1     A  12st     17      1
2     B  11aa     10      1
3     C  10ee     10      2
Run Code Online (Sandbox Code Playgroud)