如何根据熊猫条件进行交叉表?

时间:2019-03-26 20:57:03

标签: python pandas

我正在使用pandas包执行一些数据聚合和操作。我有一个看起来像这样的代码:

df = df[df['OT'] == 'OT']
pd.crosstab(df['Delivery'], [df['Week'], df['Description']]).stack().fillna(0)

它将生成以下正确的输出:

Week                                       201909  201910  201911  201912  201913  201915  201917
Delivery                   Description
Normal                        CD               23     0.0     0.0     0.0      23     0.0       2
                              CDG              26     6.0     0.0     0.0      33     0.0       6
                              CDH              40     4.0     3.0     5.0      78     0.0       4
Fast                          CD                4     0.0     0.0     0.0       6     0.0       0
                              CDG               6     2.0     2.0     1.0       6     1.0       0
                              CDH               5     0.0     0.0     4.0       5     0.0       0

问题是,也有Week列或201914列的201916列的行,尽管这些行都不满足OT列值我要过滤的条件(即df['OT'] == 'OT')。因此,一开始它们都会全部消失,后来不存在任何Week列值等于201914201916的行。但是,我要在交叉表中执行的操作是在这种情况下,我想为该列包括所有0值。因此,在上面的示例中,最终结果还应包括201914201916的列,并且所有值都应为0.0。我该如何使用pandas做到这一点?

1 个答案:

答案 0 :(得分:1)

首先,您可以将列类型检查为category,然后在处理完数据后,只需将列类型更改回str

df['Week']=df['Week'].astype('category')
s=pd.crosstab(df['Delivery'], [df['Week'], df['Description']])
s.columns=s.columns.astype(str)
s.stack().fillna(0)