Python 3.x 大熊猫新发生计数

Python 3.x 大熊猫新发生计数,python-3.x,pandas,Python 3.x,Pandas,如何为唯一的列组合指定唯一的编号,因为每个新的组合编号必须增加1 样本输入 import pandas as pd import numpy as np df=pd.DataFrame({'A':['A','A','A','B','B','B','B'], 'B':['a','a','b','a','a','a','a'], }) df A B 0 A a 1 A a 2 A b 3

如何为唯一的列组合指定唯一的编号,因为每个新的组合编号必须增加1

样本输入

import pandas as pd
import numpy as np
df=pd.DataFrame({'A':['A','A','A','B','B','B','B'],
                'B':['a','a','b','a','a','a','a'],
                })

df

    A   B
0   A   a 
1   A   a 
2   A   b 
3   B   a 
4   B   a 
5   B   a
6   B   a
期望输出

新列“C”,通过对列“A”和“B”的值分组进行计数。 如下

使用

输出

   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
输出:

   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  4
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
注意:这也适用于两个或多个连续的重复组:

df=pd.DataFrame({'A':['A','A','A','B','B','B','B','C','C','B'],
                 'B':['a','a','b','a','a','a','a','b','b','a']})

df.loc[df.drop_duplicates().index, 'C'] = 1
df['C'] = df['C'].fillna(0).cumsum().astype(int)
df
输出:

   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  4
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
注2:上述情况下,
ngroup
方法不会产生递增的“C”值,请参见最后一行值(3)与前一行(4):

输出:

   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  4
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
更新:

类似于
n组
,但从第一次出现开始计数:

df=pd.DataFrame({'A':['A','A','A','B','B','B','B','C','C','B'],
                 'B':['a','a','b','a','a','a','a','b','b','a']})

z = df.drop_duplicates().reset_index(drop=True)
z['C'] = np.arange(len(z)) + 1
df = df.merge(z, how='left')
df
输出:

   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  4
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3
   A  B  C
0  A  a  1
1  A  a  1
2  A  b  2
3  B  a  3
4  B  a  3
5  B  a  3
6  B  a  3
7  C  b  4
8  C  b  4
9  B  a  3

是的,很好。但这会将组分解成因数,因此任何在后面到达的相同组都将具有相同的值,但不知道OP想要什么。:)是的,我是根据那个OP来算的。。“新列‘C’通过将列‘A’和‘B’的值分组进行计数。如下所示”我认为这一列也有问题,请参阅我回答“如何为唯一列组合提供唯一编号”中的“注2”@perl这就是为什么八行具有相同的值的原因之一,因为它不是唯一的组合。好吧,是的,也许问题中存在一些歧义,让我们看看:)谢谢perl。关于索引9,它必须与C列的值3一致。所以它的正确性很酷,是的,然后,
n分组
是从字母表的升序开始计数的方法,是否可以避免,要求计数必须从第一行开始。请参阅我答案的“更新”部分