<p>我想你在找<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.crosstab.html" rel="nofollow noreferrer">^{<cd1>}</a></p>
<p>因为您的层变量是字符串类型,所以排序将是<code>0 1 10 2 ...</code>。您应该使用<code>.astype(int)</code>将数据类型转换为整数,以获得基于数值的排序。你知道吗</p>
<pre><code>s1 = pd.Series(['2', '10', '0', '11' , '3', '1'])
print(s1.sort_values().values)
# ['0' '1' '10' '11' '2' '3']
print(s1.astype(int).sort_values().values)
# [ 0 1 2 3 10 11]
</code></pre>
<p>所以这里有一个可能的解决方案:</p>
<pre><code>tbl = pd.crosstab(
df['PriorMonthBalanceTier'].astype(int),
df['BalanceTier'].astype(int)
)
print(tbl)
# BalanceTier 0 1 2 3 4 5 6 7 8 9 10
# PriorMonthBalanceTier
# 0 0 2 0 0 0 0 0 0 0 0 0
# 1 2 0 0 0 0 0 0 0 0 0 0
# 2 0 0 1 0 0 0 0 0 0 0 0
# 3 0 0 0 1 0 0 0 0 0 0 0
# 4 0 0 0 0 1 0 0 0 0 0 0
# 5 0 0 0 0 0 2 0 0 0 0 0
# 6 0 0 0 0 0 0 2 0 0 0 0
# 7 0 0 0 0 0 0 0 1 0 0 0
# 8 0 0 0 0 0 0 0 0 1 0 0
# 9 0 0 0 0 0 0 0 0 0 1 0
# 10 0 0 0 0 0 0 0 0 0 0 1
</code></pre>
<h2>应用筛选</h2>
<p>同样的技术可以应用于筛选列,但是您可能会发现级别<code>3 4 5 ...</code>消失了,因为它们不在筛选数据集中。你知道吗</p>
<pre><code>ind = (df['Date'].values == '10/31/2019')
tbl = pd.crosstab(
df.loc[ind, 'PriorMonthBalanceTier'].astype(int),
df.loc[ind, 'BalanceTier'].astype(int),
dropna=False
)
print(tbl)
# BalanceTier 0 1 2
# PriorMonthBalanceTier
# 0 0 2 0
# 1 2 0 0
# 2 0 0 1
</code></pre>
<p>因此,如果要在过滤后保留所有级别,可能需要<a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html" rel="nofollow noreferrer">^{<cd5>}</a>。你知道吗</p>
<pre><code>ind = (df['Date'].values == '10/31/2019')
col1 = df['PriorMonthBalanceTier'].astype(int)
col1 = pd.Categorical(col1[ind], col1.sort_values().unique())
col2 = df['BalanceTier'].astype(int)
col2 = pd.Categorical(col2[ind], col2.sort_values().unique())
tbl = pd.crosstab(
col1, col2,
rownames=['PriorMonthBalanceTier'],
colnames=['BalanceTier'],
dropna=False
)
print(tbl)
# BalanceTier 0 1 2 3 4 5 6 7 8 9 10
# PriorMonthBalanceTier
# 0 0 2 0 0 0 0 0 0 0 0 0
# 1 2 0 0 0 0 0 0 0 0 0 0
# 2 0 0 1 0 0 0 0 0 0 0 0
# 3 0 0 0 0 0 0 0 0 0 0 0
# 4 0 0 0 0 0 0 0 0 0 0 0
# 5 0 0 0 0 0 0 0 0 0 0 0
# 6 0 0 0 0 0 0 0 0 0 0 0
# 7 0 0 0 0 0 0 0 0 0 0 0
# 8 0 0 0 0 0 0 0 0 0 0 0
# 9 0 0 0 0 0 0 0 0 0 0 0
# 10 0 0 0 0 0 0 0 0 0 0 0
</code></pre>