programing

판다 데이터 프레임 및 카운트에서 선택한 열에 있는 값의 고유한 조합

abcjava 2023. 6. 20. 21:18
반응형

판다 데이터 프레임 및 카운트에서 선택한 열에 있는 값의 고유한 조합

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

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

그러나 이러한 조합은 단일 열에 있는 것으로 나타났습니다.저는 조합된 각 값을 다른 열로 분리하고 계수 결과를 위해 열을 하나 더 추가하고 싶습니다.그것이 가능합니까?당신의 제안을 받을 수 있을까요?잘 부탁드립니다.

넌 할 수 있다.groupby콜 'A'와 'B'와 콜에size그리고 나서.reset_index그리고.rename생성된 열:

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

갱신하다

두 개의 열을 그룹화함으로써, 이것은 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

groupbyArg를 받아들입니다.as_index우리가 설정할 수 있었던 것.False따라서 그룹화된 열을 인덱스로 만들지는 않지만, 이렇게 하면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

Pandas 1.1.0에서는 데이터 프레임에 이 방법을 사용할 수 있습니다.

df.value_counts() # or df[['A', 'B']].value_counts()

결과:

A    B
yes  no     4
     yes    3
no   yes    2
     no     1
dtype: int64

인덱스를 열로 변환하고 값 개수별로 정렬:

df.value_counts(ascending=True).reset_index(name='count')

결과:

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

승인된 답변과 count()와 size()의 차이와 관련된 @Bryan P의 의견에 따라 아래와 같이 count()를 클리너 코드로 선택했습니다.

df1.groupby(['A','B']).count().reset_index()

약간 관련이 있어요. 저는 독특한 조합을 찾다가 다음과 같은 방법을 생각해냈습니다.

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

나는 이것으로 시간 테스트를 해본 적이 없지만 시도하는 것은 재미있었습니다.기본적으로 두 열을 튜플 열 하나로 변환합니다.이제 이를 데이터 프레임으로 변환하여 고유한 요소를 찾아 카운트하는 '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']]

매우 에 @EdChum 변진답을에의하우매수배치기함멋▁@▁▁@▁a▁function▁into기배치하eded.count_unique_index고유한 방법은 데이터 프레임이 아닌 판다 시리즈에서만 작동합니다.아래 함수는 R:에서 고유 함수의 동작을 재현합니다.

unique는 중복 요소/행이 제거된 x와 같은 벡터, 데이터 프레임 또는 배열을 반환합니다.

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

def count_unique_index(df, by):                                                                                                                                                 
    return df.groupby(by).size().reset_index().rename(columns={0:'count'})                                                                                                      

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

언급URL : https://stackoverflow.com/questions/35268817/unique-combinations-of-values-in-selected-columns-in-pandas-data-frame-and-count

반응형