Pandas의 여러 데이터 프레임 열에서 "고유 한 선택"방법은 무엇입니까?


101

SQL과 동등한 작업을 수행하는 방법을 찾고 있습니다.

SELECT DISTINCT col1, col2 FROM dataframe_table

pandas SQL 비교에는 distinct.

.unique() 단일 열에서만 작동하므로 열을 연결하거나 목록 / 튜플에 넣고 그런 방식으로 비교할 수 있다고 가정합니다. 그러나 이것은 팬더가 좀 더 네이티브 방식으로해야하는 것처럼 보입니다.

나는 명백한 것을 놓치고 있습니까, 아니면 이것을 할 방법이 없습니까?


다음과 같은 작업을 수행해야 df.apply(pd.Series.unique)하지만 고유 한 값의 수가 열에 따라
다르면 작동하지 않으므로

답변:


172

drop_duplicates메서드를 사용하여 DataFrame에서 고유 한 행을 가져올 수 있습니다 .

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

subset특정 열만 사용하여 고유성을 확인하려는 경우 키워드 인수를 제공 할 수도 있습니다 . 독 스트링을 참조하십시오 .


3
그 지적 아마도 가치가 df.drop_duplicates()기본적으로 그렇게 (떠나 새로운 DataFrame을 반환 인플레 이스의 방법이 아닙니다 df변경되지 않음). 이것은 상당히 표준적인 동작이지만 여전히 유용 할 수 있습니다.
evophage

13

나는 다른 해결책을 시도했습니다. 첫 번째는 다음과 같습니다.

a_df=np.unique(df[['col1','col2']], axis=0)

객체 데이터가 아닌 경우에도 잘 작동합니다.이를 수행하고 오류를 방지하는 또 다른 방법 (객체 열 유형의 경우)은 drop_duplicates ()를 적용하는 것입니다.

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

SQL을 사용하여이 작업을 수행 할 수도 있지만 제 경우에는 매우 느리게 작동했습니다.

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)

7

uniquedf에 대한 방법 이 없습니다. 각 열의 고유 값 수가 같으면 다음이 작동합니다. df.apply(pd.Series.unique)그렇지 않으면 오류가 발생합니다. 또 다른 접근 방식은 열 이름을 입력하는 사전에 값을 저장하는 것입니다.

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}

여러 열에 대해 고유한지 확인할 수 있습니까?
Anoop D

numpy를 사용하여 다른 SO 질문에서 답을 얻었습니다np.unique(df[['column1','column2']].values)
Anoop D

6

비슷한 문제를 해결하기 위해 다음을 사용하고 있습니다 groupby.

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

그것이 적절한 지 여부는 결과로 무엇을하고 싶은지에 달려 있습니다 (제 경우에는 COUNT DISTINCT표시된 것과 동등한 것을 원했습니다 ).



-1

열 세트를 가져와 더 큰 세트에서 더 작은 세트를 뺄 수 있습니다.

distinct_values = set(df['a'])-set(df['b'])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.