Python:如何为数据帧条目分配唯一的id

2024-09-30 18:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像下面这样的dafarame:

df
    Name1   Name2
0   John    Jack
1   John    Albert
2   Jack    Eva
3   Albert  Sara
4   Eva     Sara

我想给每个人分配一个唯一的ID名称。所以:

df
    Name1   Name2      ID1     ID2
0   John    Jack        0       1
1   John    Albert      0       2
2   Jack    Eva         1       3
3   Albert  Sara        2       5
4   Eva     Sara        3       5

Tags: 名称iddfjohnjackid2name1id1
2条回答

如果哪个名字得到哪个号码并不重要,你也可以考虑

df.join(df.stack().astype('category').cat.codes.unstack() 
          .rename(columns=lambda c: c.replace('Name', 'ID')))                                                                  

产生

    Name1   Name2  ID1  ID2
0    John    Jack    3    2
1    John  Albert    3    0
2    Jack     Eva    2    1
3  Albert    Sara    0    4
4     Eva    Sara    1    4

首先按^{}展平值并按原始df重塑形状,使用数据帧构造函数并创建列名,最后按原始join

df1 = pd.DataFrame(pd.factorize(df.values.ravel())[0].reshape(df.shape))
df1.columns = ['ID{}'.format(x+1) for x in range(len(df1.columns))]
print (df1)
   ID1  ID2
0    0    1
1    0    2
2    1    3
3    2    4
4    3    4

df = df.join(df1)
print (df)
    Name1   Name2  ID1  ID2
0    John    Jack    0    1
1    John  Albert    0    2
2    Jack     Eva    1    3
3  Albert    Sara    2    4
4     Eva    Sara    3    4

创建MultiIndex Seriesby ^{},创建ids by ^{}和for DataFrame^{},然后rename列并通过^{}添加到原始列:

s = df.stack()
df = df.join(pd.Series(pd.factorize(s)[0], index=s.index)
               .unstack()
               .rename(columns=lambda x: x.replace('Name','ID')))
print (df)
    Name1   Name2  ID1  ID2
0    John    Jack    0    1
1    John  Albert    0    2
2    Jack     Eva    1    3
3  Albert    Sara    2    4
4     Eva    Sara    3    4

类似替代方案:

s = df.stack()
s[:] = pd.factorize(s)[0]
df = df.join(s.unstack().rename(columns=lambda x: x.replace('Name','ID')))
print (df)
    Name1   Name2  ID1  ID2
0    John    Jack    0    1
1    John  Albert    0    2
2    Jack     Eva    1    3
3  Albert    Sara    2    4
4     Eva    Sara    3    4

相关问题 更多 >