>

파이썬을 처음 접했다. SO에서 팬더 : 두 열을 조합하여 그룹화 했습니다. 불행히도, 허용 된 답변은 더 이상 판다 버전 0.23.4 에서 작동하지 않습니다  해당 게시물의 목표는 그룹 변수의 조합을 파악하고 값에 대한 사전을 작성하는 것입니다. 즉, group_by  그룹화 순서를 무시해야합니다.

허용 된 답변은 다음과 같습니다.

import pandas as pd
from collections import Counter
d = pd.DataFrame([('a','b',1), ('a','c', 2), ('b','a',3), ('b','a',3)],
                 columns=['x', 'y', 'score'])
d[['x', 'y']] = d[['x', 'y']].apply(sorted, axis=1)
x = d.groupby(['x', 'y']).agg(Counter)
print(x)

여기서 ...apply(sorted)  다음 예외가 발생합니다.

와이즈 비즈

팬더 판은 다음과 같습니다.

raise ValueError('Must have equal len keys and value ' ValueError: Must have equal len keys and value when setting with an iterable

다음은 https : /를 읽은 후 시도한 내용입니다. /pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html :

> pd.__version__
Out: '0.23.4'

안타깝게도 오류가 발생합니다 :

와이즈 비즈

예상 출력 :

d = pd.DataFrame([('a','b',1), ('a','c', 2), ('b','a',3), ('b','a',3)],
                 columns=['x', 'y', 'score'])
d=d.sort_values(by=['x','y'],axis=1).reset_index(drop=True)
x = d.groupby(['x', 'y']).agg(Counter)
print(x)

누군가 도와주세요? 참고로,

1382, in _get_label_or_level_values raise KeyError(key) KeyError: 'x'

의 수를 계산하는 방법을 안내 할 수 있다면 좋을 것입니다  와이즈 비즈  기둥. 벡터화 솔루션을 찾고 있습니다.

score count x y a b {1: 1, 3: 2} 2 c {2: 1} 1 를 사용하고 있습니다

많은 감사합니다.

keys()

  • 답변 # 1

    문제는 sorted 입니다  리턴 목록이므로 ti를 Series 로 변환해야합니다. :

    d[['x', 'y']] = d[['x', 'y']].apply(lambda x: pd.Series(sorted(x)), axis=1)
    
    

    하지만 numpy.sort 를 사용하는 것이 더 빠릅니다   DataFrame 와 함께   apply 때문에 생성자  후드 아래에 루프가 있습니다 :

    d = pd.DataFrame([('a','b',1), ('a','c', 2), ('b','a',3), ('b','a',3)],
                     columns=['x', 'y', 'score'])
    d[['x', 'y']] = pd.DataFrame(np.sort(d[['x', 'y']], axis=1), index=d.index)
    
    

    그런 다음 집계 함수 목록이 포함 된 집계에 대해서는 seelct 열이 표시됩니다 (예 : 와이즈 비즈  고유 한 값의 개수 :

    nunique
    
    

    또는 x = d.groupby(['x', 'y'])['score'].agg([Counter, 'nunique']) print(x) Counter nunique x y a b {1: 1, 3: 2} 2 c {2: 1} 1 의 수 :

    DataFrameGroupBy.size
    
    

  • 답변 # 2

    사용-

    x = d.groupby(['x', 'y'])['score'].agg([Counter, 'size'])
    print(x)
              Counter  size
    x y                    
    a b  {1: 1, 3: 2}     3
      c        {2: 1}     1
    
    

    출력

    a=d[['x','y']].values
    a.sort(axis=1)
    d[['x','y']] = a
    x = d.groupby(['x', 'y']).agg(Counter)
    print(x)
    
    

  • 답변 # 3

    score x y a b {1: 1, 3: 2} c {2: 1} 추가   result_type = 'broadcast' 에 대한 인수 중 하나로  일했다.

    .apply()
    
    

    >>> d = pd.DataFrame([('a','b',1), ('a','c', 2), ('b','a',3), ('b','a',3)], columns=['x', 'y', 'score']) >>> d[['x', 'y']] = d[['x', 'y']].apply(sorted, axis=1, result_type='broadcast') >>> x = d.groupby(['x', 'y']).agg(Counter) >>> print(x) score x y a b {1: 1, 3: 2} c {2: 1} 의 유무에 따른 차이점에 유의하십시오 .

    result_type = 'broadcast'
    
    
    보시다시피, >>> d[['x', 'y']].apply(sorted, axis=1) 0 [a, b] 1 [a, c] 2 [a, b] 3 [a, b] dtype: object >>> d[['x', 'y']].apply(sorted, axis=1, result_type='broadcast') x y 0 a b 1 a c 2 a b 3 a b   result_type = 'broadcast' 의 결과를 분할 (방송)  목록에서 해당 열로 다시 할당하여 .apply() 에 할당 .

    d[['x', 'y']]

관련 자료

  • 이전 arrays - Angular2 + 하나의 요소에 여러 템플릿 바인딩을 가질 수 없습니다
  • 다음 sml - 표준 ML에서 Word64에 대한 다형성 강제