使用循环合并 python 中的面板数据
Merging panel data in python using loop
我正在尝试通过 idcode 合并面板数据帧,并在我的数据帧中通过 'idcode' 进行排序。
我的数据变量名称是 wave68、wave69....、wave71。
总的来说,我有两个问题:
首先,我想使用循环对数据帧进行排序,但我不知道如何分配循环文件名,即wave+i
?
其次,我不知道如何使循环算法正确合并数据帧。
我想要的最终结果是按 'idcode' 由 wave68,69,70.. 使用循环排序的宽面板数据。
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)
对于跨多个 dfs 的合并,请考虑使用 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
(任何不匹配的 idcode 将保留 NaN)
dfList = [wave68, wave69, wave70, wave71]
finaldf = pd.concat([df.set_index('idcode') for df in dfList], axis=1).sort_index()
我正在尝试通过 idcode 合并面板数据帧,并在我的数据帧中通过 'idcode' 进行排序。
我的数据变量名称是 wave68、wave69....、wave71。
总的来说,我有两个问题:
首先,我想使用循环对数据帧进行排序,但我不知道如何分配循环文件名,即
wave+i
?其次,我不知道如何使循环算法正确合并数据帧。
我想要的最终结果是按 'idcode' 由 wave68,69,70.. 使用循环排序的宽面板数据。
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)
对于跨多个 dfs 的合并,请考虑使用 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
(任何不匹配的 idcode 将保留 NaN)
dfList = [wave68, wave69, wave70, wave71]
finaldf = pd.concat([df.set_index('idcode') for df in dfList], axis=1).sort_index()