1. 程式人生 > >python將戶中所有人收入均合併到戶主一行

python將戶中所有人收入均合併到戶主一行

每當要報表的時候,都會涉及每個人這一個週期內,到底得了多少收入,比如戶主是劉備,有低保,有農補,兄弟是關羽,有低保有撫卹,兒子是劉封劉禪,有撫卹,有補貼,這些一項項都能通過之前的程式碼分門別類列出。

然而扶貧站讓報的最新的表格,是都要把所有的收入,加到戶主上面,然而現在的表格是這樣的:

那麼如何將這個表,改為全都是相應的戶主呢?這就用到一個是替換的演算法,一個是Pandas的合併計算。

基本原理:將相應戶主的身份證號儲存,並將之子、之女、配偶等相關人員的身份證號均改為戶主的身份證號,再用pandas庫的合併計算功能。

import pandas as pd
tablePath = '脫貧戶享受政策個人.xls'      #資料母表的模板
zongTable = pd.DataFrame(pd.read_excel(tablePath))  # 將資料總表模板 載入
idNum = ''  #設定全域性變數
for index, row in zongTable.iterrows(): #遍歷table的每一行,用遍歷的方式準備獲取戶主和其下人口的資料
    if row['與戶主關係'] == '戶主':    #   若這一行 是戶主,則將戶主身份證號儲存入全域性變數,準備用它替代其他的人
        idNum = row['身份證號']
    else:
        zongTable.loc[index,'身份證號'] = idNum #若這一行不是戶主,則將其身份證號變為戶主的身份證號
zongTable.to_excel('result.xls')

執行結束後,相應的表格會變成這種格式:

可以看到,身份證號都已經變為和戶主一致了,再用pandas進行合併計算:

import pandas as pd

tablePath = 'result.xls'
namePath = '脫貧戶總表的副本.xls'
dataTable = pd.DataFrame(pd.read_excel(tablePath))  # 將資料總表模板 載入
dataZu = dataTable.groupby('身份證號').sum()    #將資料按身份證號進行分組合並計算(相加)

namePD = pd.DataFrame(pd.read_excel(namePath))  #讀取姓名 身份證號的表格
namePD['身份證號'] = namePD['身份證號'].apply((lambda x: str(x)[:18].upper()))
        # 有的身份證號是殘疾證號,多了2位,所以要將身份證號前18位擷取,並將字母都變成大寫,以便統一
result = pd.merge(dataZu, namePD, on=['身份證號'], how='left')
    # 按著身份證號對應的方式 將小表 加入 總表,但以總表為準
result.to_excel('脫貧戶戶主總資料.xls')

最終得到戶主為標記的,每一戶的收入總和。