2017-12-04 9 views
1

私はIDコードでパネルのデータフレームをマージしようとしており、データフレームに「IDコード」でソート処理を行っています。ループを使用してPythonでパネルデータをマージする

私のデータ変数名は、wave68、wave69 ....、wave71です。

全体的に、私は2つの問題を抱えて:

  1. まず、私は、ループを使用してデータフレームをソートしたいが、私は、すなわちwave+i、ループファイル名を割り当てる方法がわかりませんか?

  2. 第2に、データフレームを正しくマージするループアルゴリズムを作成する方法がわかりません。

最終的な結果は、幅広い形式のパネルデータです。「idcode」によってwave68,69,70でソートされています。ループを使用しています。複数のDFS間で合併のために

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) 

答えて

0

reduceとの合併チェーンを考えます。または、1つの列を使用する場合は、pd.concat()axis=1に設定し、各データフレームのインデックスを結合列に設定する前に、水平マージを実行します。その後、最終データフレームを1回だけソートできます。

注:他のデータ分析ツールと異なり、pandasではpiorをマージする必要はありません。

pd.concatとマージ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']) 

とマージ(任意不一致いるIDCODEはNaNを保持する)

dfList = [wave68, wave69, wave70, wave71] 

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

ありがとうございました。私が非常に長いdfListをwave68、...、wave150のようにしたいときは、何らかの方法がありますか? –

+0

素晴らしい!喜んで助けてください。あなたのcsv importループの間、各dfを後ではなく繰り返してリストに追加してください。実際には、地球環境の氾濫を避けるために、dfsを別々に保存しないでください。 – Parfait

関連する問題