我正在使用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
列值等于201914
或201916
的行。但是,我要在交叉表中执行的操作是在这种情况下,我想为该列包括所有0值。因此,在上面的示例中,最终结果还应包括201914
和201916
的列,并且所有值都应为0.0
。我该如何使用pandas
做到这一点?
答案 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)