2016-06-26 5 views
2

for 루프에서 생성 된 별도의 데이터 프레임으로 구성된 데이터 프레임을 생성하려고합니다. 각 개별 데이터 프레임은 이름 열, 정수 범위 및 열이 정수가 속하는 범주를 나타냅니다 (예 : 5 분위수 1 ~ 5). 개별적으로 각 데이터 프레임을 생성 한 다음 하나를 다른 데이터 프레임에 추가하여 '마스터'데이터 프레임을 만들면 아무런 문제가 없습니다. 내가 작성한For 루프에서의 팬더 데이터 프레임 추가 ValueError

ValueError: incompatible categories in categorical concat 

: 나는 (내 실제 상황에서 수행해야합니다으로) 각 dataframe을 만들기 위해 루프를 사용할 때, 다음의 마스터 dataframe 결과에 dataframe를 추가하려고 단순화 된 루프는 설명하기 : categori를 타입 캐스팅에 의해 부분적인 해결책을 얻을 수 있다는 것

 a  b c 
0 1 Group1 1 
1 2 Group1 1 
2 3 Group1 2 
3 4 Group1 2 
4 5 Group1 3 
5 6 Group1 3 
6 7 Group1 4 
7 8 Group1 4 
8 9 Group1 5 
9 10 Group1 5 
10 11 Group2 1 
11 12 Group2 1 
12 13 Group2 2 
13 14 Group2 2 
... 
28 29 Group3 5 
29 30 Group3 5 

: 같은

import numpy as np 
import pandas as pd 

# Define column names 
colNames = ('a','b','c') 

# Define a dataframe with the required column names 
masterDF = pd.DataFrame(columns = colNames) 

# A list of the group names 
names = ['Group1','Group2','Group3'] 

# Create a dataframe for each group 
for i in names: 
    tempDF = pd.DataFrame(columns = colNames) 
    tempDF['a'] = np.arange(1,11,1) 
    tempDF['b'] = i 
    tempDF['c'] = pd.cut(np.arange(1,11,1), 
         bins = np.linspace(0,10,6), 
         labels = [1,2,3,4,5]) 
    print(tempDF) 
    print('\n') 

    # Try to append temporary DF to master DF 
    masterDF = masterDF.append(tempDF,ignore_index=True) 

print(masterDF) 

내가 보이는 dataframe을 기대 그들은 tempDF에 추가되는 ES 다음과 같이

tempDF['c'] = pd.cut(np.arange(1,11,1), 
        bins = np.linspace(0,10,6), 
        labels = [1,2,3,4,5]).astype('int') 

그러나,이 경우, 카테고리 (항목 'C'는) 현재 1.0, 2.0 등보다는 1, 2, 등으로 표시되는 이상적이지 않습니다.

아무에게도 이런 일이 발생하는 이유를 설명하고보다 만족스러운 해결책을 제시 할 수 있습니까?

답변

1

먼저 모든 DataFrames 다음 concatdfs 및 목록에 추가 할 수 있습니다

dfs = [] 
# Create a dataframe for each group 
for i in names: 
    tempDF = pd.DataFrame(columns = colNames) 
    tempDF['a'] = np.arange(1,11,1) 
    tempDF['b'] = i 
    tempDF['c'] = pd.cut(np.arange(1,11,1), 
         bins = np.linspace(0,10,6), 
         labels = [1,2,3,4,5]) 
    print(tempDF) 
    print('\n') 

    # Try to append temporary DF to master DF 
    dfs.append(tempDF) 

masterDF = pd.concat(dfs, ignore_index=True) 
print(masterDF) 
    a  b c 
0 1 Group1 1 
1 2 Group1 1 
2 3 Group1 2 
3 4 Group1 2 
4 5 Group1 3 
5 6 Group1 3 
6 7 Group1 4 
7 8 Group1 4 
8 9 Group1 5 
9 10 Group1 5 
10 1 Group2 1 
11 2 Group2 1 
12 3 Group2 2 
13 4 Group2 2 
14 5 Group2 3 
15 6 Group2 3 
16 7 Group2 4 
17 8 Group2 4 
18 9 Group2 5 
19 10 Group2 5 
20 1 Group3 1 
21 2 Group3 1 
22 3 Group3 2 
23 4 Group3 2 
24 5 Group3 3 
25 6 Group3 3 
26 7 Group3 4 
27 8 Group3 4 
28 9 Group3 5 
29 10 Group3 5 
+0

감사 번개 빠른 응답! 그것은 훌륭한 해결책입니다. 나의 유일한 관심사는 개별 데이터 프레임이 큰 경우 생성되는 데이터 프레임 목록의 크기에 관한 것입니다. 여러 데이터 프레임은 어떻게 목록에 저장됩니까? 내 실제 상황에서 데이터 프레임에는 40K + 행의 데이터가 포함되어 있습니다. 성능 문제가 발생할 가능성이 있습니까? – user1718097

+0

데이터 유형에 따라 다릅니다 ... 그러나 팬더의 루프는 일반적으로 느리므로 팬더 기능을 갖춘 솔루션을 찾는 것이 좋습니다. – jezrael

+0

40k 행을 포함하는 데이터 프레임으로 이것을 테스트했으며 완벽하게 작동합니다. 솔루션을 가져 주셔서 감사합니다. 나는 이것을 답으로 표시했다. 내 원래 시도가 내 부분에 대한 오해에 실패했거나 버그입니까? – user1718097