[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
'분석 Python > Vaex' 카테고리의 다른 글
[Vaex] big data (.csv) covert to hdf5 (0) | 2020.09.02 |
---|---|
[Vaex 1.0.0-beta.6] Groupby 사용해보기 (0) | 2020.08.29 |
[Vaex 1.0.0-beta.6] Virtual Column 알아보기 (0) | 2020.08.29 |
[Vaex 1.0.0-beta.6] Virtual column 생성 후 pandas로 변경하기 (0) | 2020.08.29 |
[Vaex 1.0.0-beta.6] how to split data from str to list. (0) | 2020.08.29 |