如何使用Python添加缺少值的行

如何使用Python添加缺少值的行,python,pandas,xlrd,Python,Pandas,Xlrd,我必须添加缺少面积值的新行 下面是输入excel Name Depth Module Total Area Category Sub category 0 Module0 50 Category_1 Category_2 1 Module11 1 Category_1 Category_2 1 Module12 9 Category_1

我必须添加缺少面积值的新行

下面是输入excel

Name  Depth Module  Total Area      Category    Sub category
       0    Module0    50           Category_1  Category_2
       1    Module11   1            Category_1  Category_2
       1    Module12   9            Category_1  Category_2
       2    Module21   3            Category_1  Category_2
       2    Module22   5            Category_1  Category_2

       1    Module13   5            Category_1  Category_2
       2    Module21   2            Category_1  Category_2
       2    Module22   1            Category_1  Category_2
       2    Module23   1            Category_1  Category_2

       1    Module14   2            Category_1  Category_2
       1    Module15   3            Category_1  Category_2
       1    Module16   4            Category_1  Category_2
       1    Module17   7            Category_1  Category_2
       1    Module18   6            Category_1  Category_2
       1    Module19   2            Category_1  Category_2
       1    Module120  5            Category_1  Category_2
       1    Module121  3            Category_1  Category_2

输入excel的说明: 在上面的Excel表格中,深度只是图层。 输入包含,深度0分为深度1的个数意味着深度1的和应等于深度0。深度1(1+9+5+2+3+4+7+6+2+5+3=47),但深度0为50,因此,遗漏的总面积为3(50-47)。 我必须添加3个值作为类别的深度1

类似地,深度1被划分为深度2,所以深度2之和等于深度1。我们坐第三排。模块12(9)分为深度2的数量(3+5=8),此处缺失的总面积为1(9-8)

所以,我添加了一个名为MISC的额外行,它缺少了总面积。 我需要使用python添加MISC行。最好是熊猫

我试过下面的脚本。但它只支持一行,我需要添加整个excel工作表,其中包含missed Total_Area列

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

ip = "test.xlsx"
op = "test1.xlsx"
df = pd.read_excel(ip, 'Sheet1') 

def Insert_row(row_number, df, row_value): 
    start_upper = 0 
    end_upper = row_number 
    start_lower = row_number 
    end_lower = df.shape[0] 
    upper_half = [*range(start_upper, end_upper, 1)] 
    lower_half = [*range(start_lower, end_lower, 1)] 
    lower_half = [x.__add__(1) for x in lower_half] 
    index_ = upper_half + lower_half 
    df.index = index_ 
    df.loc[row_number] = row_value 
    df = df.sort_index() 
    return df  

row_number = 7 
row_value = ['MISC',2 , 'MISC',1 ,'Category_1' ,'Category_2'] 

if row_number > df.index.max()+1: 
    print("Invalid row_number") 
else: 
    df = Insert_row(row_number, df, row_value) 
    df.to_excel(op, index=False) 
预期产出:

Name  Depth Module  Total Area      Category    Sub category
       0    Module0    50           Category_1  Category_2
       1    Module11   1            Category_1  Category_2
       1    Module12   9            Category_1  Category_2
       2    Module21   3            Category_1  Category_2
       2    Module22   5            Category_1  Category_2
**MISC   2    MISC       1          Category_1  Category_2**
       1    Module13   5            Category_1  Category_2
       2    Module21   2            Category_1  Category_2
       2    Module22   1            Category_1  Category_2
       2    Module23   1            Category_1  Category_2
**MISC   2    MISC     1            Category_1  Category_2**
       1    Module14   2            Category_1  Category_2
       1    Module15   3            Category_1  Category_2
       1    Module16   4            Category_1  Category_2
       1    Module17   7            Category_1  Category_2
       1    Module18   6            Category_1  Category_2
       1    Module19   2            Category_1  Category_2
       1    Module120  5            Category_1  Category_2
       1    Module121  3            Category_1  Category_2
**MISC   1  MISC       3            Category_1  Category_2**

我认为将
df.loc[row\u number]=row\u value
更改为
df.iloc[…]=将解决问题。As、.loc[]基于标签,而.iloc[]基于索引或整数。谢谢@Subrata,但我的excel文件有5000多行。所以,我在想,行数也应该取自脚本。我的脚本应该是插入行,填充所需的深度和总面积值。如果您有任何逻辑,请告诉我。您是否可以共享原始数据?我不太确定如何自动填充数据,因为我看到第4行和第8行具有相同的深度、模块、类别和子类别。我只能想到用空行分割文件。@CedricZoppolo,我只关注总面积和深度值。第4行(总深度拆分为9,但在9中我仅将3分类)是第3行的拆分。其中,as线号8(总深度拆分为5。此处共5个,分类为2)是线号7的拆分。我已将深度0拆分为深度1,将深度1拆分为深度2。所有深度1的总和应等于深度0。我将一些深度1分类为深度2。所以,深度2之和应该是深度1(前一行)的值。你有多少深度?是否只到2点?我认为将
df.loc[row_number]=row_value
更改为
df.iloc[…]=将解决问题。As、.loc[]基于标签,而.iloc[]基于索引或整数。谢谢@Subrata,但我的excel文件有5000多行。所以,我在想,行数也应该取自脚本。我的脚本应该是插入行,填充所需的深度和总面积值。如果您有任何逻辑,请告诉我。您是否可以共享原始数据?我不太确定如何自动填充数据,因为我看到第4行和第8行具有相同的深度、模块、类别和子类别。我只能想到用空行分割文件。@CedricZoppolo,我只关注总面积和深度值。第4行(总深度拆分为9,但在9中我仅将3分类)是第3行的拆分。其中,as线号8(总深度拆分为5。此处共5个,分类为2)是线号7的拆分。我已将深度0拆分为深度1,将深度1拆分为深度2。所有深度1的总和应等于深度0。我将一些深度1分类为深度2。所以,深度2之和应该是深度1(前一行)的值。你有多少深度?只到2点吗?