Python 在数据框中插入行小计

Python 在数据框中插入行小计,python,pandas,data-science,xlsxwriter,Python,Pandas,Data Science,Xlsxwriter,目标: 我有一个pandas数据框,如下所示,有多个列,我想得到几个列的小计,并在Placement#Name处写上“Total” 数据帧: 我的尝试: **adsize_sales_second_table.loc["Grand Total"] = pd.Series(adsize_sales_second_table.loc [:, ["Delivered Impres

目标: 我有一个pandas数据框,如下所示,有多个列,我想得到几个列的小计,并在Placement#Name处写上“Total”

数据帧:

我的尝试:

**adsize_sales_second_table.loc["Grand Total"] = pd.Series(adsize_sales_second_table.loc
                                                             [:, ["Delivered Impressions",
                                                                  "Clicks",
                                                                  "Conversion", "Spend"]].sum(),
                                                    index=["Delivered Impressions", "Clicks", "Conversion", "Spend"]**
                                                             )
  adsize_sales_data = adsize_sales_second_table.loc[:, ["Placement# Name", "Adsize", "Delivered Impressions", "Clicks",
                                                              "CTR", "Conversion", "Conversion Rate", "Spend", "eCPA"]]


        cols = ["Delivered Impressions", "Clicks", "Conversion", "Spend"]

        adsize_sales_data['Placement# Name'] = adsize_sales_data['Placement# Name'].ffill()
        grand = adsize_sales_data[cols].sum()
        grand.loc['Placement# Name'] = 'Grand total'

        adsize_sales_data_new = adsize_sales_data.groupby('Placement# Name')[cols].sum()

        adsize_sales_data_new.index = adsize_sales_data.index.astype(str)+'____'

        adsize_sales_data = (pd.concat([adsize_sales_data.set_index('Placement# Name'), adsize_sales_data_new], keys=('a', 'b')).sort_index(level=1).reset_index())

        adsize_sales_data['Placement# Name'] = np.where(adsize_sales_data ['level_0'] == 'a', adsize_sales_data['Placement# Name'], 'Total')

        adsize_sales_data = adsize_sales_data.drop('level_0', axis=1)

        adsize_sales_data.loc[len(adsize_sales_data.index)] = grand

        print (adsize_sales_data)
这是在最后添加一行,无法计算以填充小计:

预期输出: 我希望输出结果如下所示

请参见编辑的代码:

**adsize_sales_second_table.loc["Grand Total"] = pd.Series(adsize_sales_second_table.loc
                                                             [:, ["Delivered Impressions",
                                                                  "Clicks",
                                                                  "Conversion", "Spend"]].sum(),
                                                    index=["Delivered Impressions", "Clicks", "Conversion", "Spend"]**
                                                             )
  adsize_sales_data = adsize_sales_second_table.loc[:, ["Placement# Name", "Adsize", "Delivered Impressions", "Clicks",
                                                              "CTR", "Conversion", "Conversion Rate", "Spend", "eCPA"]]


        cols = ["Delivered Impressions", "Clicks", "Conversion", "Spend"]

        adsize_sales_data['Placement# Name'] = adsize_sales_data['Placement# Name'].ffill()
        grand = adsize_sales_data[cols].sum()
        grand.loc['Placement# Name'] = 'Grand total'

        adsize_sales_data_new = adsize_sales_data.groupby('Placement# Name')[cols].sum()

        adsize_sales_data_new.index = adsize_sales_data.index.astype(str)+'____'

        adsize_sales_data = (pd.concat([adsize_sales_data.set_index('Placement# Name'), adsize_sales_data_new], keys=('a', 'b')).sort_index(level=1).reset_index())

        adsize_sales_data['Placement# Name'] = np.where(adsize_sales_data ['level_0'] == 'a', adsize_sales_data['Placement# Name'], 'Total')

        adsize_sales_data = adsize_sales_data.drop('level_0', axis=1)

        adsize_sales_data.loc[len(adsize_sales_data.index)] = grand

        print (adsize_sales_data)
它现在给出的值有误。

使用:

#specify columns to sum
cols = ["Delivered Impressions", "Clicks", "Conversion", "Spend"]
#replace NaNs by forward filling
df['Placement# Name'] = df['Placement# Name'].ffill()
#count grand total
grand = df[cols].sum()
grand.loc['Placement# Name'] = 'Grand total'
print (grand)

#get subtotal by aggregation sum 
df1 = df.groupby('Placement# Name')[cols].sum()
#change sum for correct order
df1.index = df1.index + '____'
#join to original, sort by second level of MultiIndex
df = (pd.concat([df.set_index('Placement# Name'), df1], keys=('a', 'b'))
        .sort_index(level=1)
        .reset_index())

#change values to total
df['Placement# Name'] = np.where(df['level_0'] == 'a', df['Placement# Name'], 'Total')
#remove column
df = df.drop('level_0', axis=1)
#add grand total
df.loc[len(df.index)] = grand

编辑1:

cols = ["Delivered Impressions", "Clicks", "Conversion", "Spend"]

df['Placement# Name'] = df['Placement# Name'].ffill()
grand = df[cols].sum()
grand.loc['Placement# Name'] = 'Grand total'
print (grand)

df1 = df.groupby('Placement# Name')[cols].sum()
df1.index = df1.index + '____'

#create empty DataFrame
df2 = pd.DataFrame(index=df1.index + '__')
df = pd.concat([df.set_index('Placement# Name'), df1, df2], keys=('a', 'b', 'c')).sort_index(level=1).reset_index()

#get output by 2 conditions
m1 = df['level_0'] == 'a'
m2 = df['level_0'] == 'c'
df['Placement# Name'] = np.select([m1, m2], [df['Placement# Name'], np.nan], default='Total')
df = df.drop('level_0', axis=1)
df.loc[len(df.index)] = grand


谢谢你的努力,不过看起来有点棘手。如果数据帧看起来像附加的屏幕截图,并且在同一个文件上得到类似的输出,该怎么办。这会使检查变得容易吗?看见edits@abhilashmishra-如果想使用熊猫,我没有更好的解决方案,对不起。另一个数据帧有问题吗?你能解释一下问题出在哪里吗?这行的adsize\u sales\u data\u new.index=adsize\u sales\u data.index++uuuuuuuuuuuuuuuuu然后使用
adsize\u sales\u data\u new.index=adsize\u sales\u data.index.astype(str)+'\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu