2016-06-26 9 views
2

forループで生成された個別のデータフレームで構成されるデータフレームを生成したい。各個別のデータフレームは、名前列、整数の範囲および列が、整数が属するカテゴリを識別する(例えば、5分音符1~5)。私が個々のデータフレームを個別に生成し、一方を他方に追加して「マスタ」データフレームを作成すると、問題はありません。私が書いたForループでのパンダデータフレームの追加ValueError

ValueError: incompatible categories in categorical concat 

:私は(私は私の現実の状況で行う必要がありますように)個々のデータフレームを作成するためにループを使用する場合しかし、その後でマスターデータフレームの結果へのデータフレームを追加しようとしています

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) 

を私はのように見えたデータフレームを期待する:説明するために簡略化ループ

 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 

部分的な解決策はcategoriを型キャストすることによって得ることができると思われますそれらは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

最初dfs、その後concatを一覧表示するには、すべてのDataFramesを追加することができます軽量化・高速応答のための

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

関連する問題