<p>使用<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.stack.html" rel="nofollow noreferrer">^{<cd1>}</a>表示<code>Series</code>和<code>MultiIndex</code>,通过<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.to_frame.html" rel="nofollow noreferrer">^{<cd5>}</a>转换为一行<code>DataFrame</code>,并转置和最后展平<code>MultiIndex</code>:</p>
<pre><code>df = df.stack().to_frame().T
df.columns = df.columns.map(lambda x: f'{x[1]}_{x[0]}').str.replace('_0','')
print (df)
Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
0 200 ABC 300 DEF 400 GHI
</code></pre>
<p>或用于扁平化使用列表理解:</p>
<pre><code>df = df.stack().to_frame().T
df.columns = [f'{b}' if a == 0 else f'{b}_{a}' for a, b in df.columns]
print (df)
Rank DutyCode Rank_1 DutyCode_1 Rank_2 DutyCode_2
0 200 ABC 300 DEF 400 GHI
</code></pre>
<p>编辑:</p>
<pre><code>import ast
#if necessary
#df['Rank'] = df['Rank'].apply(ast.literal_eval)
df = pd.json_normalize(df.pop('Rank')).add_prefix('Rank.').join(df)
print (df)
Rank.a Rank.i DutyCode
0 b j ABC
1 b j DEF
2 b j GHI
df = df.stack().to_frame().T
df.columns = [f'{b}' if a == 0 else f'{b}_{a}' for a, b in df.columns]
print (df)
Rank.a Rank.i DutyCode Rank.a_1 Rank.i_1 DutyCode_1 Rank.a_2 Rank.i_2 \
0 b j ABC b j DEF b j
DutyCode_2
0 GHI
</code></pre>