[Vaex] Join on Multiple Columns

2020. 9. 2. 19:11분석 Python/Vaex

728x90

기존 제공하는 방식이나, Pandas에서 아는 방식으로는 안 되는 것을 확인하고 테스트 결과를 공유함.

특징 1. left와 right가 같은 이름인 경우 되지 않음.

특징 2. 한개의 key만 join이 가능함.

print(train_input.get_column_names())
print(train_output.get_column_names())

['ID', 'I', 'J', 'K', 'KHNC', 'KHND', 'KHNG', 'KHPC', 'KHPD', 'KHPG', 'TMC1', 'TMC2', 'TMD1', 'TMD2', 'TMG1', 'TMG2', 'KTG1C', 'KTG2C', 'KTG1D', 'KTG2D', 'KTG1G', 'KTG2G', 'KRC', 'KLC', 'KDC', 'RNITM', 'KRN', 'KLN', 'KDN', 'KRP', 'KLP', 'KDP', 'KRO', 'REA', 'WSC', 'WSD', 'WSG', 'WSRP', 'WSLP', 'PMC', 'PMD', 'PMG', 'BMRC', 'BMRD', 'BMRG', 'PRRC', 'PRRD', 'PRRG', 'index']
['ID', 'I', 'J', 'K', 'Time', 'CHC', 'CHD', 'CHG', 'RPOC', 'LPOC', 'DOC', 'RPOP', 'LPOP', 'DOP', 'PO4', 'RPON', 'LPON', 'DON', 'NH4', 'NO3', 'DO', 'index']

여기서 Multiple key는 ["ID", "I" , "J" , "K" ]

이름 변경

name = ["ID","I","J","K"]
rename_on = []
for on in name :
    rename = f"{on}_right"
    train_input.rename_column(on,rename)
    rename_on.append(rename)

한개의 그룹으로 만들어주기

value2 = (train_output[name[0]].astype(str)+ 
         "_"+train_output[name[1]].astype(str)+ 
         "_"+train_output[name[2]].astype(str)+ 
         "_"+train_output[name[3]].astype(str))
train_output["group_left"] = value2

value = (train_input[rename_on[0]].astype(str)+ "_"+
    train_input[rename_on[1]].astype(str)+ "_"+
    train_input[rename_on[2]].astype(str)+ "_"+
    train_input[rename_on[3]].astype(str)
)
#train_input.add_column("group_right",value)
train_input["group_right"] = value

train_input.drop(["index"], inplace=True)
train_output.drop(["index"] ,inplace=True)

Join

train_join_result = train_output.join(train_input, left_on="group_left", right_on="group_right")

중복 칼럼 및 사용한 칼럼 제거

train_join_result.drop(rename_on + ["group_left","group_right"],inplace=True)

다시 저장

train_join_result.export_hdf5("train_input_output_join.hdf5")

 

Pandas 처럼 그냥 되지 않아서 아쉽다.

그래서 큰 데이터에서 메모리를 사용하지 않으면서, 빠르게 읽고, 빠르게 Join 할 수 있다는 것에 대해서는 만족

 

 

def multipe_column_join(x_left, x_right, keys_left , keys_right,how="left") :
    if len(keys_left) == 1 :
        join_result = x_left.join(x_right, 
                                  left_on=keys_left[0], right_on=keys_right[0], how=how,
                                  allow_duplication=True)
    
    elif len(keys_left) > 1 :
        for idx , right_key in enumerate(keys_right) :
            if idx == 0 :
                x_right["group_right"] = x_right[right_key].astype(str)
            else :
                x_right["group_right"] = x_right["group_right"] + "_" + x_right[right_key].astype(str)
        for idx , left_key in enumerate(keys_left) :
            if idx == 0 :
                x_left["group_left"] = x_left[left_key].astype(str)
            else :
                x_left["group_left"] = x_left["group_left"] + "_" + x_left[left_key].astype(str)

        x_left.drop(keys_left,inplace=True)
        x_right.drop(keys_right,inplace=True)
        join_result = x_left.join(x_right, left_on="group_left", right_on="group_right",how=how)
        join_result.drop(["group_left","group_right"],inplace=True)
    return join_result

join_result = multipe_column_join(x, 
                                  y,
                                  keys_left = ['xx1'], 
                                  keys_right = ['xx2'],
                                  how="left")
728x90