Pandas 데이터 프레임 및 개수에서 선택한 열의 고유 한 값 조합


108

다음과 같이 팬더 데이터 프레임에 데이터가 있습니다.

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
                   'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})

그래서 내 데이터는 다음과 같습니다.

----------------------------
index         A        B
0           yes      yes
1           yes       no
2           yes       no
3           yes       no
4            no      yes
5            no      yes
6           yes       no
7           yes      yes
8           yes      yes
9            no       no
-----------------------------

다른 데이터 프레임으로 변환하고 싶습니다. 예상 출력은 다음 python 스크립트에 표시 될 수 있습니다.

output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})

그래서 내 예상 출력은 다음과 같습니다.

--------------------------------------------
index      A       B       count
--------------------------------------------
0         no       no        1
1         no      yes        2
2        yes       no        4
3        yes      yes        3
--------------------------------------------

실제로 다음 명령을 사용하여 모든 조합을 찾고 계산할 수 있습니다. mytable = df1.groupby(['A','B']).size()

그러나 이러한 조합은 단일 열에 있습니다. 조합의 각 값을 다른 열로 분리하고 계산 결과에 대해 하나 이상의 열을 추가하고 싶습니다. 그렇게 할 수 있습니까? 당신의 제안이 있습니까? 미리 감사드립니다.

답변:


174

당신은 할 수 groupbyCOLS 'A'와 'B'와 통화 sizereset_indexrename생성 된 열 :

In [26]:

df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Out[26]:
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

최신 정보

2 개의 열을 그룹화하여 A와 B 값이 동일한 행을 그룹화하여 설명하면 size고유 한 그룹의 수를 반환하는 호출 을 호출 합니다.

In[202]:
df1.groupby(['A','B']).size()

Out[202]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64

이제 그룹화 된 열을 복원하려면 다음을 호출합니다 reset_index.

In[203]:
df1.groupby(['A','B']).size().reset_index()

Out[203]: 
     A    B  0
0   no   no  1
1   no  yes  2
2  yes   no  4
3  yes  yes  3

이렇게하면 인덱스가 복원되지만 크기 집계는 생성 된 열로 0변경되므로 이름을 바꿔야합니다.

In[204]:
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})

Out[204]: 
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

groupby그룹화 된 열을 인덱스로 만들지 않도록 as_index설정할 수 있는 인수 를 허용 False하지만 이것은 a를 생성 series하고 인덱스 등을 복원해야합니다 .... :

In[205]:
df1.groupby(['A','B'], as_index=False).size()

Out[205]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64

2

약간의 관련이 있으므로 고유 한 조합을 찾고이 방법을 생각해 냈습니다.

def unique_columns(df,columns):

    result = pd.Series(index = df.index)

    groups = meta_data_csv.groupby(by = columns)
    for name,group in groups:
       is_unique = len(group) == 1
       result.loc[group.index] = is_unique

    assert not result.isnull().any()

    return result

그리고 모든 조합이 고유하다고 단언하려는 경우 :

df1.set_index(['A','B']).index.is_unique

에 대해 몰랐습니다 set_index(). groupby()특정 공통 열 쌍이있는 행을 그룹화 하는 데 계속 사용하려고합니다 . 놀랍습니다, 감사합니다!
user3290553

0

@EdChum의 아주 좋은 대답을 함수에 넣습니다 count_unique_index. 고유 한 방법은 데이터 프레임이 아닌 pandas 시리즈에서만 작동합니다. 아래 함수는 R 의 고유 함수 동작을 재현합니다 .

unique는 x와 같은 벡터, 데이터 프레임 또는 배열을 반환하지만 중복 요소 / 행이 제거되었습니다.

그리고 OP에 의해 요청 된 발생 횟수를 추가합니다.

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],                                                                                             
                    'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})                                                                                               
def count_unique_index(df, by):                                                                                                                                                 
    return df.groupby(by).size().reset_index().rename(columns={0:'count'})                                                                                                      

count_unique_index(df1, ['A','B'])                                                                                                                                              
     A    B  count                                                                                                                                                                  
0   no   no      1                                                                                                                                                                  
1   no  yes      2                                                                                                                                                                  
2  yes   no      4                                                                                                                                                                  
3  yes  yes      3

0

이걸로 시간 테스트를 해본 적은 없지만 시도하는 것이 즐거웠습니다. 기본적으로 두 개의 열을 하나의 튜플 열로 변환합니다. 이제 변환 이를 수행합니다 dataframe에 독특한 요소 발견 'value_counts ()' 카운트를. 다시 zip으로 바이올린을 켜고 원하는 순서대로 열을 넣으십시오. 단계를 더 우아하게 만들 수는 있지만 튜플 작업은이 문제에 대해 나에게 더 자연스럽게 보입니다.

b = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})

b['count'] = pd.Series(zip(*[b.A,b.B]))
df = pd.DataFrame(b['count'].value_counts().reset_index())
df['A'], df['B'] = zip(*df['index'])
df = df.drop(columns='index')[['A','B','count']]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.