Python 向数据帧添加重复索引

Python 向数据帧添加重复索引,python,pandas,Python,Pandas,我有这样一个数据帧: name food mike pizza mike cookie mike banana mary apple mary pear jane broccoli id name food 1 mike pizza 1 mike cookie 1 mike banana 2 mary apple 2 mary pear

我有这样一个数据帧:

name      food
mike     pizza  
mike    cookie  
mike    banana  
mary     apple  
mary      pear  
jane  broccoli
id  name      food
 1  mike     pizza  
 1  mike    cookie  
 1  mike    banana  
 2  mary     apple  
 2  mary      pear  
 3  jane  broccoli
我想添加一个序列整数列,它是name所独有的,如下所示:

name      food
mike     pizza  
mike    cookie  
mike    banana  
mary     apple  
mary      pear  
jane  broccoli
id  name      food
 1  mike     pizza  
 1  mike    cookie  
 1  mike    banana  
 2  mary     apple  
 2  mary      pear  
 3  jane  broccoli
有没有优雅的熊猫一号(或二号)班轮可以做到这一点?我对熊猫还不熟悉,我怀疑有一种方法可以使用groupby和lambda的组合来实现,但我没有取得任何进展。

你可以让

df['id'] = (df.name != df.name.shift(1)).cumsum()
你可以让

df['id'] = (df.name != df.name.shift(1)).cumsum()
试试这个:

df.set_index((~df.name.duplicated()).cumsum())
      name      food
name                
1     mike   pizza  
1     mike  cookie  
1     mike  banana  
2     mary   apple  
2     mary    pear  
3     jane  broccoli
试试这个:

df.set_index((~df.name.duplicated()).cumsum())
      name      food
name                
1     mike   pizza  
1     mike  cookie  
1     mike  banana  
2     mary   apple  
2     mary    pear  
3     jane  broccoli

您可以使用
pd.factorize

df['Id'] = pd.factorize(df['name'])[0] + 1
输出:

   name      food  Id
0  mike     pizza   1
1  mike    cookie   1
2  mike    banana   1
3  mary     apple   2
4  mary      pear   2
5  jane  broccoli   3
    name      food
Id                
1   mike     pizza
1   mike    cookie
1   mike    banana
2   mary     apple
2   mary      pear
3   jane  broccoli
然后设置索引Id:

df.set_index('Id')
输出:

   name      food  Id
0  mike     pizza   1
1  mike    cookie   1
2  mike    banana   1
3  mary     apple   2
4  mary      pear   2
5  jane  broccoli   3
    name      food
Id                
1   mike     pizza
1   mike    cookie
1   mike    banana
2   mary     apple
2   mary      pear
3   jane  broccoli

您可以使用
pd.factorize

df['Id'] = pd.factorize(df['name'])[0] + 1
输出:

   name      food  Id
0  mike     pizza   1
1  mike    cookie   1
2  mike    banana   1
3  mary     apple   2
4  mary      pear   2
5  jane  broccoli   3
    name      food
Id                
1   mike     pizza
1   mike    cookie
1   mike    banana
2   mary     apple
2   mary      pear
3   jane  broccoli
然后设置索引Id:

df.set_index('Id')
输出:

   name      food  Id
0  mike     pizza   1
1  mike    cookie   1
2  mike    banana   1
3  mary     apple   2
4  mary      pear   2
5  jane  broccoli   3
    name      food
Id                
1   mike     pizza
1   mike    cookie
1   mike    banana
2   mary     apple
2   mary      pear
3   jane  broccoli

df[“name”].astype(“category”).cat.code对每个姓名都是唯一的,或者对每个连续的姓名分组都是唯一的(张贴的答案似乎完成了这一点)。对于排序后的数据帧,它们可能是相同的,但通常不是。
df.groupby('name',sort=False)。ngroup()+1
可能就是您想要的。每个名称都是唯一的,计数器基于数据框中的出现情况,而不是任何字典排序。
df[“name”].astype(“category”).cat.code对每个名称都是唯一的,或者对每个连续的名称分组都是唯一的(发布的答案似乎完成了)。对于排序后的数据帧,它们可能是相同的,但通常不是。
df.groupby('name',sort=False)。ngroup()+1
可能就是您想要的。每个名称都是唯一的,计数器基于数据帧中的出现情况,而不是任何字典排序。如果
名称
值未排序怎么办?提供的示例表明它们是唯一的@Superduper?是的,在我的例子中,它们是被排序的,所以这个答案是有效的,但是对于一般用法,因子分解似乎更好。给未来的访问者一个提示:这个解决方案和公认的解决方案都可以工作,但在我的例子中,结果是设置了CopyWarning(jupteryLab 0.35.3中的python 3.7内核),如果
name
值没有排序怎么办?提供的示例表明它们是正确的@Superduper?是的,在我的例子中,它们是被排序的,所以这个答案是有效的,但是对于一般用法,因子分解似乎更好。给未来的访问者一个提示:这个解决方案和公认的解决方案都有效,但在我的例子中,结果是设置了CopyWarning(jupteryLab 0.35.3中的python 3.7内核)。所有其他答案都很好,坦白地说,我没有意识到我知道的是多么少——每个人的解决方案都会产生正确的数据帧索引——我不知道这是一件事;我只想要一列值,这和fuglede的解决方案在一行中完成。这一个似乎对排序不敏感,这是一个额外的好处。所有其他答案都很好,坦率地说,我不知道我知道的有多少——每个人的解决方案都会产生正确的数据帧索引——我不知道这是一件事;我只想要一列值,这和fuglede的解决方案在一行中完成。这一个似乎是排序不敏感,这是一个额外的好处。