• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

merge와 그룹바이 관련 질문이 있습니다.

22.05.01 13:31 작성 조회수 289

1

1. merge 할 때 혹시 이런 조건도 가능한가요? 

sql중에 join하면

select * from x as T1

left join y as T2 on T1.columns1 = T2.columns1

and T1.columns2 <> T2.columns2

이와 같이 두 테이블의 칼럼이 같지 않은 조건을 포함할 수는 없나요? merge를 보면 on 절에 = 조건만 들어가는 것 같아서 문의드립니다. 

 

2. 판다스의 groupby는 널값이 있는 행을 제외하고 그룹바이하는 걸로 아는데 어쩔 수 없이 데이터 자체에 널값이 포함되어 있는 경우 행마다 널값에 대한 사전전처리를 하지 않고 널값을 포함한 채로 그룹바이할 수는 없는건가요? 

sql은 널값을 포함한 채로 그룹바이가 가능한걸로 알고 있어서 문의드립니다.

답변 3

·

답변을 작성해보세요.

0

전재웅님의 프로필

전재웅

질문자

2022.05.04

예를 들어 설명을 드리면

 

DF1  

    A B C    T

0   1   2   33   4

 

 

DF2

A  B   D

0 1  2   33

1 1  2   55

2 1  2   66

 

 

DF1을 기준으로 DF2를 붙이는 left merge를 해야 하는데,

칼럼 C의 값과 같지 않은 칼럼 D만 붙이고 싶습니다. 

 

원하는 결과 

 

    A B C     T    D

0   1   2    33    4    55

1   1   2    33    4    66

 

 

sql은 아래처럼 가능한것으로 알고 있는데

 

select * from T1 left join T2 on T1.A = T2.A  on T1.A = T2.A  on T1.A <> T2.A

 

파이썬은 혹시 가능한지 문의드립니다. 

안녕하세요.

아쉽게도 판다스는 on 을 통해서 key 값을 지정하는 형태라 값이 같은 key  에 대해서만 join, merge 가 가능합니다.

[pandas.DataFrame.join — pandas 1.4.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html)

[pandas.DataFrame.merge — pandas 1.4.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html)

 

 

0

전재웅님의 프로필

전재웅

질문자

2022.05.01

감사합니다. 강사님,

left_on, right_on은 동등조건일로 알고 있는데요 예를 들면 left_on = T1.columA, right_on=T2.columB와 같이 칼럼이름이 다른경우 라도 칼럼 내용이 같으면 이에 따라 left, right, inner, outer 조인인 것으로 알고 있습니다. sql처럼 columnA와 columnB의 내용이 같이 않을 때 조인도 가능할까요? 

 

 

dropna=False는 멀티인덱싱일 경우 동작을 안하네요.

제가 이 케이스라.. 전처리를 다 하는 수 밖에 없겠네요...

Note that as of this writing, there is a bug that makes dropna=False fail with MultiIndex grouping.

https://stackoverflow.com/questions/18429491/pandas-groupby-columns-with-nan-missing-values

 

안녕하세요.

join 을 할 때는 컬럼 이름에 상관없이 key 가 되는 값이 있어야 연결을 할 수 있습니다. 내용이 다른데 조인이 가능하다는게 어떤 의미인지 다시 질문해 주시겠어요? 기준이 되는 값이 있어야 연결을 해줄 수 있습니다.

0

안녕하세요.

 

1)  left_on, right_on 등으로 사용해 볼 수 있습니다.

DataFrame.merge(righthow='inner'on=Noneleft_on=Noneright_on=Noneleft_index=Falseright_index=Falsesort=Falsesuffixes=('_x', '_y')copy=Trueindicator=Falsevalidate=None)

문서 링크 입니다 : [pandas.DataFrame.merge — pandas 1.4.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html)

2) dropna=False 로 사용해 보세요!

문서 링크 입니다 :  [pandas.DataFrame.groupby — pandas 1.4.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html)