<p>在筛选大于0的行之前,您可以使用<a href="https://pyjanitor.readthedocs.io/reference/janitor.functions/janitor.pivot_longer.html#janitor.pivot_longer" rel="nofollow noreferrer">pivot_longer</a>from <a href="https://pyjanitor.readthedocs.io/index.html" rel="nofollow noreferrer">pyjanitor</a>来重塑数据:</p>
<pre><code> import janitor
(df
.pivot_longer(index=['school_name', 'city'],
names_to=("levels", ".value"),
names_sep="_")
.query("capacity > 0")
)
school_name city levels capacity
0 a Bangkok primary 1
1 b Frankfurt primary 3
3 a Bangkok secondary 2
5 c Tel Aviv secondary 6
6 a Bangkok tertiary 3
7 b Frankfurt tertiary 6
</code></pre>
<p>您还可以使用pandas <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.wide_to_long.html" rel="nofollow noreferrer">wide_to_long</a>:</p>
<pre><code>temp = df.rename(columns= lambda x: "_".join(x.split("_")[::-1])
if 'capacity' in x
else x)
(pd.wide_to_long(temp,
'capacity',
['school_name', 'city'],
"levels",
"_",
".+")
.query('capacity > 0').reset_index()
)
school_name city levels capacity
0 a Bangkok primary 1
1 a Bangkok secondary 2
2 a Bangkok tertiary 3
3 b Frankfurt primary 3
4 b Frankfurt tertiary 6
5 c Tel Aviv secondary 6
</code></pre>
<p>您的问题已被编辑,因此此答案应足够:</p>
<pre><code>(data.melt(['school_name', 'city'],
var_name='levels',
value_name='capacity')
.query('capacity > 0'))
school_name city levels capacity
0 a Bangkok primary 1
1 b Frankfurt primary 3
3 a Bangkok secondary 2
5 c Tel Aviv secondary 6
6 a Bangkok tertiary 3
7 b Frankfurt tertiary 6
</code></pre>