<p>首先按<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html" rel="nofollow noreferrer">^{<cd1>}</a>展平值并按原始<code>df</code>重塑形状,使用数据帧构造函数并创建列名,最后按原始<code>join</code>:</p>
<pre><code>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
</code></pre>
<p>创建<code>MultiIndex Series</code>by <a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.stack.html" rel="nofollow noreferrer">^{<cd5>}</a>,创建<code>id</code>s by <a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.factorize.html" rel="nofollow noreferrer">^{<cd7>}</a>和for <code>DataFrame</code><a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unstack.html" rel="nofollow noreferrer">^{<cd9>}</a>,然后<code>rename</code>列并通过<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html" rel="nofollow noreferrer">^{<cd3>}</a>添加到原始列:</p>
<pre><code>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
</code></pre>
<p>类似替代方案:</p>
<pre><code>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
</code></pre>