您好我有以下数据帧
df =
A B
John Tom
Homer Bart
Tom Maggie
Lisa John
Run Code Online (Sandbox Code Playgroud)
我想为每个名称分配一个唯一的ID并返回
df =
A B C D
John Tom 0 1
Homer Bart 2 3
Tom Maggie 1 4
Lisa John 5 0
Run Code Online (Sandbox Code Playgroud)
我所做的是以下内容:
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])
Run Code Online (Sandbox Code Playgroud)
但由于我有一个非常大的数据集,这个过程非常缓慢.
这是一种方式.首先获取唯一名称数组:
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)
Run Code Online (Sandbox Code Playgroud)
并将其设为系列,将名称映射到各自的数字:
In [13]: names = pd.unique(df.values.ravel())
In [14]: names = pd.Series(np.arange(len(names)), names)
In [15]: names
Out[15]:
John 0
Tom 1
Homer 2
Bart 3
Maggie 4
Lisa 5
dtype: int64
Run Code Online (Sandbox Code Playgroud)
现在使用applymap和names.get查找这些数字:
In [16]: df.applymap(names.get)
Out[16]:
A B
0 0 1
1 2 3
2 1 4
3 5 0
Run Code Online (Sandbox Code Playgroud)
并将其分配给正确的列:
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
Run Code Online (Sandbox Code Playgroud)
注意:这假设所有值都是以名称开头的名称,您可能只想将其限制为某些列:
df[['A', 'B']].values.ravel()
...
df[['A', 'B']].applymap(names.get)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4538 次 |
| 最近记录: |