<p>在带有<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html" rel="nofollow noreferrer">^{<cd3>}</a>的列中对<code>MultiIndex</code>使用<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html" rel="nofollow noreferrer">^{<cd1>}</a>,然后用<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html" rel="nofollow noreferrer">^{<cd5>}</a>替换<code>NaN</code>s,强制转换为<code>integer</code>s,最后将<code>MultiIndex</code>转换为<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reset_index.html" rel="nofollow noreferrer">^{<cd8>}</a>列:</p>
<pre><code>s1 = df1.drop_duplicates(['Name','Club']).set_index(['Name','Club'])['Overall']
s2 = df2.drop_duplicates(['Name','Club']).set_index(['Name','Club'])['Overall']
df = pd.concat([s2, s1], axis=1, keys=('FIFA13','FIFA18')).fillna(0).astype(int).reset_index()
print (df)
Name Club FIFA13 FIFA18
0 Casillas Real Madrid CF 89 0
1 Cristiano Ronaldo Real Madrid CF 92 94
2 David Silva Manchester City 88 0
3 De Gea Manchester United 0 90
4 F. Ribéry FC Bayern Munich 90 0
5 Falcao Atlético Madrid 88 0
6 G. Bale Real Madrid CF 0 90
7 Iniesta FC Barcelona 90 0
8 J. Boateng FC Bayern Munich 0 90
9 L. Messi FC Barcelona 94 93
10 L. Suárez FC Barcelona 0 92
11 M. Neuer FC Bayern Munich 0 92
12 N. Vidić Manchester United 89 0
13 Neymar FC Barcelona 0 92
14 R. Lewandowski FC Bayern Munich 0 90
15 T. Courtois Chelsean 0 89
16 W. Rooney Manchester United 89 0
17 Xavi FC Barcelona 90 0
18 Z. Ibrahimović Manchester United 0 90
19 Z. Ibrahimović Paris Saint-Germain 88 0
</code></pre>
<p>如果顺序是重要的,解决方案是相似的,只获得唯一对<code>Names</code>和<code>Club</code>,通过<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html" rel="nofollow noreferrer">^{<cd11>}</a>和<a href="http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.reindex.html" rel="nofollow noreferrer">^{<cd12>}</a>连接在一起并删除重复项:</p>
<pre><code>s1 = df1.drop_duplicates(['Name','Club']).set_index(['Name','Club'])['Overall']
s2 = df2.drop_duplicates(['Name','Club']).set_index(['Name','Club'])['Overall']
df = pd.concat([s2, s1], axis=1, keys=('FIFA13','FIFA18')).fillna(0).astype(int)
idx = pd.concat([df1[['Name','Club']], df2[['Name','Club']]]).drop_duplicates()
df = df.reindex(idx).reset_index().drop_duplicates('Name', keep='last')
print (df)
Name Club FIFA13 FIFA18
0 L. Messi FC Barcelona 94 93
1 Cristiano Ronaldo Real Madrid CF 92 94
2 F. Ribéry FC Bayern Munich 90 0
3 Xavi FC Barcelona 90 0
4 Iniesta FC Barcelona 90 0
5 N. Vidić Manchester United 89 0
6 W. Rooney Manchester United 89 0
7 Casillas Real Madrid CF 89 0
8 David Silva Manchester City 88 0
9 Falcao Atlético Madrid 88 0
11 Neymar FC Barcelona 0 92
12 L. Suárez FC Barcelona 0 92
13 M. Neuer FC Bayern Munich 0 92
14 De Gea Manchester United 0 90
15 R. Lewandowski FC Bayern Munich 0 90
16 J. Boateng FC Bayern Munich 0 90
17 G. Bale Real Madrid CF 0 90
18 Z. Ibrahimović Manchester United 0 90
19 T. Courtois Chelsean 0 89
</code></pre>
<p>对于一般解决方案,请使用<code>list comprehension</code>:</p>
<pre><code>dfs = [df2, df1]
names= ['FIFA13','FIFA18']
s = [x.drop_duplicates(['Name','Club']).set_index(['Name','Club'])['Overall'] for x in dfs]
df = pd.concat(s, axis=1, keys=(names)).fillna(0).astype(int)
s1 = [x[['Name','Club']] for x in dfs]
idx = pd.concat(s1).drop_duplicates()
df = df.reindex(idx).reset_index().drop_duplicates('Name', keep='last')
</code></pre>