판다 고유 값 여러 열
df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
'Col3': np.random.random(5)})
'Col1'과 'Col2'의 고유 값을 반환하는 가장 좋은 방법은 무엇입니까?
원하는 출력은
'Bob', 'Joe', 'Bill', 'Mary', 'Steve'
pd.unique
입력 배열, 데이터 프레임 열 또는 인덱스에서 고유한 값을 반환합니다.
이 함수에 대한 입력은 1차원이어야 하므로 여러 열을 결합해야 합니다.가장 간단한 방법은 원하는 열을 선택한 다음 평평한 NumPy 배열에서 값을 보는 것입니다.전체 작업은 다음과 같습니다.
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
참고:ravel()
가능한 경우 다차원 배열의 뷰를 반환하는 배열 메서드입니다.논쟁'K'
요소가 메모리에 저장되는 순서대로 배열을 평평하게 만드는 방법을 알려줍니다(판다는 일반적으로 기본 배열을 포트란 연속 순서로 저장하고 열은 행 앞에 있음).이는 방법의 기본 'C' 순서를 사용하는 것보다 훨씬 빠를 수 있습니다.
다른 방법은 열을 선택하여 다음으로 전달하는 것입니다.
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
사용할 필요가 없습니다.ravel()
여기서 메소드는 다차원 배열을 처리합니다.그렇더라도, 이것은 다음보다 느릴 가능성이 높습니다.pd.unique
고유한 값을 식별하기 위해 해시 테이블이 아닌 정렬 기반 알고리즘을 사용하기 때문입니다.
속도의 차이는 대형 데이터 프레임(특히 고유한 값이 소수인 경우)에서 매우 큽니다.
>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
설정했습니다.DataFrame
열에 몇 개의 간단한 문자열이 있습니다.
>>> df
a b
0 a g
1 b h
2 d a
3 e e
관심 있는 열을 연결하여 호출할 수 있습니다.unique
함수:
>>> pandas.concat([df['a'], df['b']]).unique()
array(['a', 'b', 'd', 'e', 'g', 'h'], dtype=object)
In [5]: set(df.Col1).union(set(df.Col2))
Out[5]: {'Bill', 'Bob', 'Joe', 'Mary', 'Steve'}
또는:
set(df.Col1) | set(df.Col2)
numpy v1.13+를 사용하는 업데이트된 솔루션에서는 여러 열을 사용하는 경우 np.unique로 축을 지정해야 합니다. 그렇지 않으면 배열이 암묵적으로 평평해집니다.
import numpy as np
np.unique(df[['col1', 'col2']], axis=0)
이 변경 사항은 2016년 11월에 도입되었습니다. https://github.com/numpy/numpy/commit/1f764dbff7c496d6636dc0430f083ada9ff4e4be
모든 것을 사랑하는 판다, 적용, 그리고 물론 람다 기능:
df['Col3'] = df[['Col1', 'Col2']].apply(lambda x: ''.join(x), axis=1)
다른 방법이 있습니다.
import numpy as np
set(np.concatenate(df.values))
비pandas
솔루션: 세트 사용().
import pandas as pd
import numpy as np
df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
'Col3' : np.random.random(5)})
print df
print set(df.Col1.append(df.Col2).values)
출력:
Col1 Col2 Col3
0 Bob Joe 0.201079
1 Joe Steve 0.703279
2 Bill Bob 0.722724
3 Mary Bob 0.093912
4 Joe Steve 0.766027
set(['Steve', 'Bob', 'Bill', 'Joe', 'Mary'])
df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
'Col3': np.random.random(5)})
각 열의 고유 값을 개별적으로 가져오는 방법이 문제라면?
목록에서 열 레이블 정렬
column_labels = ['Col1', 'Col2']
빈 딕트 만들기
unique_dict = {}
선택한 열을 반복하여 고유한 값을 가져옵니다.
for column_label in column_labels:
unique_values = df[column_label].unique()
unique_dict.update({column_label: unique_values})
unique_ser = pd.Series(unique_dict)
print(unique_ser)
list(set(df[['Col1', 'Col2']].as_matrix().reshape((1,-1)).tolist()[0]))
출력은 ['Mary', 'Joe', 'Steve', 'Bob', 'Bill']입니다.
열 이름 목록이 지정된 고유 값 목록을 가져옵니다.
cols = ['col1','col2','col3','col4']
unique_l = pd.concat([df[col] for col in cols]).unique()
import pandas as pd
df= pd.DataFrame({'col1':["a","a","b","c","c","d"],'col2':
["x","x","y","y","z","w"],'col3':[1,2,2,3,4,2]})
df
출력은
col1 col2 col3
0 a x 1
1 a x 2
2 b y 2
3 c y 3
4 c z 4
5 d w 2
모든 열에서 고유한 값을 가져옵니다.
a={}
for i in range(df.shape[1]) :
j=df.columns[i]
a[j] = df.iloc[:,i].unique()
for p,q in a.items():
print( f"unique value in {p} are {list(q)} ")
아웃풋은
unique value in col1 are ['a', 'b', 'c', 'd']
unique value in col2 are ['x', 'y', 'z', 'w']
unique value in col3 are [1, 2, 3, 4]
언급URL : https://stackoverflow.com/questions/26977076/pandas-unique-values-multiple-columns
'programing' 카테고리의 다른 글
왜 (x)++의 크기가 컴파일됩니까? (0) | 2023.06.15 |
---|---|
Oracle: DDL 및 트랜잭션 롤백 (0) | 2023.06.15 |
C와 C++에서 const pointer-to-point는 무엇을 의미합니까? (0) | 2023.06.15 |
프로젝트에 대한 종속성 그래프를 얻을 수 있는 방법이 있습니까? (0) | 2023.06.15 |
Firebase 3.x - 토큰/세션 만료 (0) | 2023.06.15 |