为列pandas data fram分配唯一id

2024-10-03 13:21:49 发布

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

你好,我有以下数据帧

df = 
A      B   
John   Tom
Homer  Bart
Tom    Maggie
Lisa   John 

我想为每个名字分配一个唯一的ID并返回

^{pr2}$

我所做的是:

LL1 = pd.concat([df.a,df.b],ignore_index=True)
LL1 = pd.DataFrame(LL1)
LL1.columns=['a']
nameun = pd.unique(LL1.a.ravel())
LLout['c'] = 0
LLout['d'] = 0
NN = list(nameun)
for i in range(1,len(LLout)):
   LLout.c[i] = NN.index(LLout.a[i])
   LLout.d[i] = NN.index(LLout.b[i])

但由于我有一个非常大的数据集,这个过程非常缓慢。在


Tags: 数据dfindexnn名字johnpdlisa
2条回答

有一个办法。首先获取唯一名称的数组:

In [11]: df.values.ravel()
Out[11]: array(['John', 'Tom', 'Homer', 'Bart', 'Tom', 'Maggie', 'Lisa', 'John'], dtype=object)

In [12]: pd.unique(df.values.ravel())
Out[12]: array(['John', 'Tom', 'Homer', 'Bart', 'Maggie', 'Lisa'], dtype=object)

把这个列成一个系列,把名字映射到它们各自的数字上:

^{pr2}$

现在使用applymapnames.get查找这些数字:

In [16]: df.applymap(names.get)
Out[16]:
   A  B
0  0  1
1  2  3
2  1  4
3  5  0

并将其分配到正确的列:

In [17]: df[["C", "D"]] = df.applymap(names.get)

In [18]: df
Out[18]:
       A       B  C  D
0   John     Tom  0  1
1  Homer    Bart  2  3
2    Tom  Maggie  1  4
3   Lisa    John  5  0

注意:这假设所有值都是以名称开头的,您可能希望仅将此限制为某些列:

df[['A', 'B']].values.ravel()
...
df[['A', 'B']].applymap(names.get)

(注意:我假设您不关心John成为的映射的精确细节,例如,只关心其中有一个。)

方法1:可以使用Categorical对象作为中介:

>>> ranked = pd.Categorical(df.stack()).codes.reshape(df.shape)
>>> df.join(pd.DataFrame(ranked, columns=["C", "D"]))
       A       B  C  D
0   John     Tom  2  5
1  Homer    Bart  1  0
2    Tom  Maggie  5  4
3   Lisa    John  3  2

感觉你应该能够以某种方式(无论是直接还是通过生成一个序列)将范畴视为提供一个编码字典,但是我看不到一个方便的方法来做到这一点。在

方法2:可以使用rank("dense"),它按顺序为每个值生成一个递增的数字:

^{pr2}$

相关问题 更多 >