为了账号安全,请及时绑定邮箱和手机立即绑定

即使列中不存在数据,Pandas也会使用自定义列进行透视

即使列中不存在数据,Pandas也会使用自定义列进行透视

白衣非少年 2023-08-08 15:42:07
我有以下示例表:df = pd.DataFrame({'Name': ['Bob', 'Bob', 'Susan', 'Susan', 'Jane','Jane'],                   'Status': ['Paid', 'Paid', 'Paid OTP', 'Overdue', '', 'Upsell'],                   'Amt': [100, 200, 300, 200, 0,60]})我正在尝试使用以下代码创建一个数据透视表(可以使用):table = pd.pivot_table(df, values='Amt', index=['Name'],columns=['Status'], aggfunc=np.sum, fill_value=0)但是我需要包含一个持久列,例如:“待付款”,无论表中是否有值。这样做的原因是,如果该特定月份填写了“待付款”,则显示 0 值。
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

Index.union如果不存在,则用于向列名称添加新值DataFrame.reindex


cols = table.columns.union(['To Be Paid'], sort=False)

table = table.reindex(cols, axis=1, fill_value=0)

print (table)

          Overdue  Paid  Paid OTP  Upsell  To Be Paid

Name                                                 

Bob    0        0   300         0       0           0

Jane   0        0     0         0      60           0

Susan  0      200     0       300       0           0


查看完整回答
反对 回复 2023-08-08
?
交互式爱情

TA贡献1712条经验 获得超3个赞

您还可以将列转换Status为分类,并确保“待付款”是当前类别(即使它未在数据中表示)


df = pd.DataFrame({'Name': ['Bob', 'Bob', 'Susan', 'Susan', 'Jane','Jane'],

                   'Status': ['Paid', 'Paid', 'Paid OTP', 'Overdue', '', 'Upsell'],

                   'Amt': [100, 200, 300, 200, 0,60]})


df["Status"] = pd.Categorical(df["Status"])

if "To Be Paid" not in df["Status"].cat.categories:

    df["Status"].cat.add_categories("To Be Paid", inplace=True)



df.pivot_table(values='Amt', index='Name', columns='Status', aggfunc=np.sum, fill_value=0, dropna=False)

Status     Overdue  Paid  Paid OTP  Upsell  To Be Paid

Name                                                  

Bob     0  0        300   0         0       0         

Jane    0  0        0     0         60      0         

Susan   0  200      0     300       0       0 


查看完整回答
反对 回复 2023-08-08
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信