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

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

SELECT DISTINCT col1, col2 FROM dataframe_table

pandas SQL 비교에는 distinct.

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

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



답변

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


답변

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

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)


답변

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)}


답변

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

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

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


답변

drop duplicate때때로 데이터 프레임에 따라 사용 이 그렇게 유용하지 않을 것이라고 생각합니다 .

나는 이것을 찾았다:

[in] df['col_1'].unique()
[out] array(['A', 'B', 'C'], dtype=object)

그리고 나를 위해 일하십시오!

https://riptutorial.com/pandas/example/26077/select-distinct-rows-across-dataframe


답변

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

distinct_values = set(df['a'])-set(df['b'])


답변