使用循环在python中合并面板数据[重复]

Posted

技术标签:

【中文标题】使用循环在python中合并面板数据[重复]【英文标题】:Merging panel data in python using loop [duplicate] 【发布时间】:2018-05-18 05:05:42 【问题描述】:

我正在尝试通过 idcode 合并面板数据框,并在我的数据框中通过 'idcode' 进行排序。

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

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

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

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

我想要的最终结果是宽格式面板数据,由 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】:

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

请注意:与其他数据分析工具不同,在 pandas 中,您不需要在合并之前进行排序。

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

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合并 (任何不匹配的idcodes都会保留NaN)

dfList = [wave68, wave69, wave70, wave71]

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

【讨论】:

谢谢它对我很有帮助!当我想制作很长的 dfList 像 wave68, ..., wave150. 时,有什么方法吗? 太棒了!乐意效劳。在 csv 导入循环期间,将每个 df 迭代地而不是之后附加到列表中。事实上,永远不要单独保存 dfs,以免淹没全局环境。

以上是关于使用循环在python中合并面板数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用熊猫循环合并大量csv文件[重复]

在Python中合并不同长度的数据帧。

在 Python 中合并数据框时出现重复的行

Python中可变数据的重复数据删除/合并

在python中使用for循环时出现JSONDecodeError [重复]

Python 3 - 合并 .xls/删除行/删除重复项