2017-02-07 5 views
0

다음 데이터 프레임에 대해 w.r.t freq 열을 그룹화하고 데이터를 저장하고 각 빈의 개수 데이터를 합산합니다.pandas 잘라 내기 및 적용 : 계열에 대한 예기치 않은 동작

예 데이터는 내가 예상대로

0  (0, 1] 
1 (1, inf] 
2 (1, inf] 
Name: freq, dtype: category 
Categories (2, object): [(0, 1] < (1, inf]] 

그래서 모든 작품 출력

pd.cut(df.freq, bins=[0,1, np.infty]) 

를 사용하여 데이터를 절단하기 위해이

df = pd.DataFrame({"freq":[1,2,3], "count": [10,25,3]}) 
print(df) 
    count freq 
0  10  1 
1  25  2 
2  3  3 

처럼 보인다. 그러나 이제 df의 freq 열을 해당 저장소에 매핑하려고합니다. 나는 이것이 적용 할 때 달성 될 수 있다고 생각한다. 형식 오류

TypeError: putmask() argument 1 must be numpy.ndarray, not numpy.int64 

하지만, 그 df.freq 시행시에있어서

pd.DataFrame(df.freq).apply(lambda x: pd.cut(x, bins=[0,1, np.infty])) 

예상 출력 DataFrame 같이 그러나 followig 방식으로

df.freq.apply(lambda x: pd.cut(x, bins=[0,1, np.infty])) 

수율을 적용 이용 빈에 매핑이 반환됩니다.

 freq 
0 (0, 1] 
1 (1, inf] 
2 (1, inf] 

왜 Series-type에서 캐스팅 된 데이터 프레임이 여기에 필요한가요? TypeError는 예상되는 배열이 정수임을 암시합니다. 그러나, pandas.tile._bin_to_cut 함수를 검사하면이 동작이 어디에서 오는지 알 수 없습니다.

제안 사항이 있습니까?

btw.

print (type(pd.cut(df.freq, bins=[0,1, np.infty]))) 
<class 'pandas.core.series.Series'> 

print (df.groupby(pd.cut(df.freq, bins=[0,1, np.infty]))['count'].sum().reset_index()) 
     freq count 
0 (0, 1]  10 
1 (1, inf]  28 

또한 새 열 출력을 할당 할 수 있습니다 :

을 파이썬 3.6 팬더 0.19.2는 groupby 비닝 Series에 의해 기능 cut를 반환하는 나는, apply이 필요하지 생각해야 할
+1

이해가 안 무엇을 당신의 목적 r "원하는 출력"입니다. 당신은 이미 그 데이터를'cut' 호출의 출력으로 가지고 있습니다. 'apply'로 무엇을 성취하려고합니까? – BrenBarn

+0

freq 열을 bin으로 매핑 한 다음 bin으로 그룹화하려고합니다. 어딘가에 매핑이 누락 된 것 같지만, jezrales가 보여 주듯이 모든 것이 이미 있습니다. – Quickbeam2k1

+0

하지만 왜 "맵핑"해야합니까? 왜 당신은 이미 가지고있는 bin 값으로 그룹화하지 않을까요? – BrenBarn

답변

1

를 사용하는
df['freq'] = pd.cut(df.freq, bins=[0,1, np.infty]) 
print (df) 

    count  freq 
0  10 (0, 1] 
1  25 (1, inf] 
2  3 (1, inf] 

print (df.groupby('freq')['count'].sum().reset_index()) 
     freq count 
0 (0, 1]  10 
1 (1, inf]  28 

df = df.assign(freq=pd.cut(df.freq, bins=[0,1, np.infty])) 
print (df) 
    count  freq 
0  10 (0, 1] 
1  25 (1, inf] 
2  3 (1, inf] 

print (df.groupby('freq')['count'].sum().reset_index()) 
     freq count 
0 (0, 1]  10 
1 (1, inf]  28 
+0

대답의 첫 번째 블록에서, freq 열로 실제로 그룹화하여 그룹을 어디에서 어떻게 보장합니까? 위에서 보았 듯이, 나의 예전 컷은 이름을 반환합니다. 이 이름과 관련하여 열이 선택 되었습니까? 그 후에, 그 columnd의 행은 컷 쓰레기통의 범주 레벨에 매핑되고 우리는 그룹화됩니다.이게 여기서 일어나는거야? 약간의 마법 같은 느낌이 들다. – Quickbeam2k1

+0

'groupby'를 사용하는 표준 방법은'df.groupby ('freq') [ 'count']. sum(). reset_index()'와 같은'column name '이다. 그러나 다른 계열의 길이 나 numpy 배열이'DataFrame'의 길이와 같으면'by' 매개 변수로 전달할 수 있습니다. 장점은 새로운 컬럼이 생성되지 않기 때문에 솔루션이 빠릅니다. 그러나 길이가 다르면 오류가 발생합니다. – jezrael

+1

[docs] (http://pandas.pydata.org/pandas-docs/stable/groupby.html#splitting-an-object-into-groups)에서 찾았습니다 – jezrael