2017-03-27 2 views
1

이것은 설명하기가 조금 어렵 기 때문에 나와 함께하시기 바랍니다. 여러 개의 열을 그룹화하여 python pandas 데이터 프레임 필터링

enter image description here

가 어떻게 새로운 dataframe를 만들 수 있습니다 아래, 즉

  1. 은 각 행에 대해, 5 개 행이 아래의 기준과 일치처럼 나는 테이블이 가정이 될 것입니다 첫 번째 행이 (200, 311) 사이에 있고 두 번째 행이 (312, 370) 사이 인 열 A의 값입니다.

  2. 각 열의 3 열은 범위 사이, 즉 첫 번째 열이 (1,16) 사이의 두 번째 열과 같은 열 B의 값이됩니다.

  3. 각 셀의 값, 해당 열과 행과 일치하는 C 열의 값의 합계입니다.

예 :

enter image description here

어떤 그림? 숫자는 무작위예요, 제 예를 따를 필요는 없습니다.

고맙습니다.


내 솔루션은 다음 두 목록에서 행 기준 및 열 기준을 정의하기 전 새로운 dataframe에 각 셀의 값을 채우기 위해 내장 된 루프를 실행했다. 그것은 작동하지만 그 천천히,하지만 난 팬더 데이터 프레임 이후 궁금해하고, 거기에 어떤 루프없이 쿼리에서 일을해야합니다.

다시 한번 감사드립니다!

답변

3

당신은 합계를 얻기 위해 pivot_table에 공급 한 후 그들을 당신의 범위를 얻을 수 cut을 사용하고 있습니다 :

# Setup example data. 
np.random.seed([3, 1415]) 
n = 100 
df = pd.DataFrame({ 
    'A': np.random.randint(200, 601, size=n), 
    'B': np.random.randint(1, 101, size=n), 
    'C': np.random.randint(25, size=n) 
    }) 

# Use cut to get the ranges. 
a_bins = pd.cut(df['A'], bins=[200, 311, 370, 450, 550, 600], include_lowest=True) 
b_bins = pd.cut(df['B'], bins=[1, 16, 67, 100], include_lowest=True) 

# Pivot to get the sums. 
df2 = df.pivot_table(index=a_bins, columns=b_bins, values='C', aggfunc='sum', fill_value=0) 

결과 출력 :

B   [1, 16] (16, 67] (67, 100] 
A          
[200, 311]  82  118  153 
(311, 370]  68  56   45 
(370, 450]  41  129   40 
(450, 550]  32  121   57 
(550, 600]  0  112   47 
+0

감사, 그래서 I가 특정 번호 단지 동일한 간격이 있으면? 범위 대신 c = 333이라고 말하십시오. 어떻게 이것을 빈에서 정의 할 수 있습니까? – Windtalker

+0

정수 값만 있다고 가정하면 길이가 1 인 빈을 정의 할 수 있습니다 (예 : 'pd_cut'에서'bins = [..., 332, 333, ...]'을 사용하고 첫 번째 버킷이면'include_lowest = True'를 생략하면 더 낮은 값이 포함되지 않습니다. 332. 332는'(332, 333)'에 포함되어 있기 때문에 이것은 float가있는 경우에는 작동하지 않을 것이므로 다른 메소드 (332, 333) 이 경우에 필요합니다. – root

+0

오, 내 나쁜, 그런 간단한 질문 ... 다시 한번 감사드립니다. – Windtalker

1

정말 @root's solution처럼! 여기 pd.crosstab있어서 사용되는, 약간 수정 한 라이너 버전 :

In [102]: pd.crosstab(
    ...:  pd.cut(df['A'], bins=[200, 311, 370, 450, 550, 600], include_lowest=True), 
    ...:  pd.cut(df['B'], bins=[1, 16, 67, 100], include_lowest=True), 
    ...:  df['C'], 
    ...:  aggfunc='sum' 
    ...:) 
    ...: 
Out[102]: 
B   [1, 16] (16, 67] (67, 100] 
A 
[200, 311]  31  157  117 
(311, 370]  23  90   38 
(370, 450]  110  168   60 
(450, 550]  37  117  115 
(550, 600]  35  19   49 
+0

고맙습니다. 그렇다면 특정 숫자와 같은 간격이 있다면 어떻게해야합니까? 범위 내에서 어떻게 정의 할 것인가? – Windtalker

+0

@Windtalker는 bin을 생성하기 위해'np.arange' 또는'np.linspace'를 사용합니다. – MaxU

+0

다시 한번 감사드립니다! – Windtalker

관련 문제