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)
답변
unique
df에 대한 방법 이 없습니다. 각 열의 고유 값 수가 같으면 다음이 작동합니다. 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'])