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的解决方案在一行中完成。这一个似乎是排序不敏感,这是一个额外的好处。