Python pivot_table - 添加差异列

Cha*_*tra 5 python pivot-table pandas

我是python的新手。我有以下数据框。我能够在 Excel 中旋转。

我想添加差异列(在图像中,我手动添加了它)。

不同的是BA值。我能够使用 Python 数据透视表复制差异列和总计。下面是我的代码。

table = pd.pivot_table(data, index=['Category'], values = ['value'], columns=['Name','Date'], fill_value=0)
Run Code Online (Sandbox Code Playgroud)

如何添加差异列并计算值?

我怎样才能在底部获得总计?

数据如下

df = pd.DataFrame({
"Value": [0.1, 0.2, 3, 1, -.5, 4],
"Date": ["2020-07-01", "2020-07-01", "2020-07-01", "2020-07-01", "2020-07-01", "2020-07-01"],
"Name": ['A', 'A', 'A', 'B', 'B', 'B'],
"HI Display1": ["X", "Y", "Z", "Z", "Y", "X"]})
Run Code Online (Sandbox Code Playgroud)

我想要数据透视表如下

数据透视表

Roy*_*012 5

这是一种方法:

df = pd.DataFrame({
    "Name": ["A", "A", "A", "B", "B", "B"], 
    "Date": "2020-07-01", 
    "Value": [0.1, 0.2, 3, 2, -.5, 4], 
    "Category": ["Z", "Y", "X", "Z", "Y", "X"]
})

piv = pd.pivot_table(df, index="Category", columns="Name", aggfunc=sum)
piv.columns = [c[1] for c in piv.columns]
piv["diff"] = piv.B - piv.A
Run Code Online (Sandbox Code Playgroud)

输出 ( piv) 是:

            A    B  diff
Category                
X         3.0  4.0   1.0
Y         0.2 -0.5  -0.7
Z         0.1  2.0   1.9
Run Code Online (Sandbox Code Playgroud)

要为 A 和 B 添加“总计”,请执行

piv.loc["total"] = piv.sum()
Run Code Online (Sandbox Code Playgroud)

从“差异”列中删除总计:

piv.loc["total", "diff"] = "" # or np.NaN, if you'd like to be more 
                              # 'pandas' style. 
Run Code Online (Sandbox Code Playgroud)

现在的输出是:

            A    B  diff
Category                
X         3.0  4.0   1.0
Y         0.2 -0.5  -0.7
Z         0.1  2.0   1.9
total     3.3  5.5   
Run Code Online (Sandbox Code Playgroud)

如果此时您想在类别顶部添加标题“名称”,请执行以下操作:

piv.columns = pd.MultiIndex.from_product([["Name"], piv.columns])
Run Code Online (Sandbox Code Playgroud)

piv 就是现在:

         Name          
            A    B diff
Category               
X         3.0  4.0  1.0
Y         0.2 -0.5 -0.7
Z         0.1  2.0  1.9
total     3.3  5.5  
Run Code Online (Sandbox Code Playgroud)

要将日期添加到每一列:

date = df.Date.max()
piv.columns = pd.MultiIndex.from_tuples([c+(date,) for c in piv.columns])

==>
               Name                      
                  A          B       diff
         2020-07-01 2020-07-01 2020-07-01
Category                                 
X               3.0        4.0          1
Y               0.2       -0.5       -0.7
Z               0.1        2.0        1.9
total           3.3        5.5           
Run Code Online (Sandbox Code Playgroud)

最后,要为列着色(例如,如果您使用的是 Jupyter),请执行以下操作:

second_col = piv.columns[2]
piv.style.background_gradient("PiYG", subset = [second_col]).highlight_null('white').set_na_rep("")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明