使用循环在python中合并面板数据

时间:2017-12-04 17:01:14

标签: python pandas loops merge panel-data

我正在尝试按IDcode合并面板数据框,并在我的数据框中按“idcode”进行排序。

我的数据变量名称是wave68,wave69 ....,wave71。

总的来说,我有两个问题:

  1. 首先,我想使用循环对数据帧进行排序,但我不知道如何分配循环文件名,即wave+i

  2. 其次,我不知道如何使循环算法正确合并数据帧。

  3. 我想要的最终结果是通过wave68,69,70按'idcode'排序的宽格式面板数据。使用循环。

    import pandas as pd
    import numpy as np
    
    wave68 = pd.read_csv('panel_data/wave68.csv')
    wave69 = pd.read_csv('panel_data/wave69.csv')
    wave70 = pd.read_csv('panel_data/wave70.csv')
    wave71 = pd.read_csv('panel_data/wave71.csv')
    
    df = [wave68,wave69,wave70,wave71]
    
    def my_sorter(file_name,var):
        for i in file_name:        
            file_name[i].sort_values(by=[var])
    
    wave68 = wave68.sort_values(by=['idcode'])
    wave69 = wave69.sort_values(by=['idcode'])
    wave70 = wave70.sort_values(by=['idcode'])
    
    merged = pd.merge(wave68, wave69, on='idcode')
    merged = pd.merge(merged, wave70, on='idcode')
    merged = pd.merge(merged, wave71, on='idcode')
    
    merged.head(20)
    

1 个答案:

答案 0 :(得分:0)

要跨多个dfs进行合并,请考虑与reduce进行链合并。或者,如果使用一列,则使用pd.concat()设置axis=1运行水平合并,但在此之前将每个数据帧的索引设置为连接列。然后,您可以只对最终的数据帧进行一次排序。

请注意:与其他数据分析工具不同,在pandas中,您无需将pior排序为合并。

reduce合并 (仅保留所有dfs中匹配的ID码,否则使用左连接)

from functools import reduce
...
dfList = [wave68, wave69, wave70, wave71]

finaldf = reduce(lambda left, right: pd.merge(left, right, on=['idcode']), dfList).sort_values(['idcode'])

pd.concat合并 (任何不匹配的ID码都会保留NaN)

dfList = [wave68, wave69, wave70, wave71]

finaldf = pd.concat([df.set_index('idcode') for df in dfList], axis=1).sort_index()