2017-09-21 7 views
3

python 3.5でPandasモジュールを使用してサブディレクトリからクロス集計を再帰的に読み込み、pd.crosstab()を呼び出した後にforループ内のクロス集計を連結したいforループの後に出力をexcelファイルに書き込みます。私はpd.crosstab()を呼び出した後にtable3をtable3にコピーしようとしましたが(コードを参照)、後者のデータファイルに値がない場合、table3はそれらのエントリのNaNを示します。私はpd.concatを見ましたが、forループでどのように使用するかの例は見つかりません。パンダでforループを読むときにクロス集計を連結する方法

(そこにあるファイルの多くの列を持つ100Sがありますが、ここで私が興味を持って列のみを示す)のようなデータファイルを見て:私のPythonプログラムは、(上からの輸入を取り除くように見える

First Data File 
    StudentID Grade  
    3   A 
    2   B 
    1   A 

    Second Data File 
    StudentID Grade 
    1   B 
    2   A 
    3   A 

    Third Data File 
    StudentID Grade 
    2   C 
    1   B 
    3   A 

    and so on .... 
    At the end the output should be like: 

    Grade  A B C 
    StudentID 
    1   1 2 0 
    2   1 1 1 
    3   3 0 0 

ファイルの)

.....

fields = ['StudentID', 'Grade'] 
path= 'C:/script_testing/' 
i=0 

for filename in glob.glob('C:/script_testing/**/*.txt', recursive=True): 
    temp = pd.read_csv(filename, sep=',', usecols=fields) 
    table1 = pd.crosstab(temp.StudentID, temp.Grade) 
    # Note the if condition is executed only once to initlialize table3 
    if(i==0): 
     table3 = table1 
     i = i + 1 
    table3 = table3 + table1 

writer = pd.ExcelWriter('Report.xlsx', engine='xlsxwriter') 
table3.to_excel(writer, sheet_name='StudentID_vs_Grade') 
writer.save() 

答えて

1
pd.concat([df1, df2, df3]).pipe(lambda d: pd.crosstab(d.StudentID, d.Grade)) 

Grade  A B C 
StudentID   
1   1 2 0 
2   1 1 1 
3   3 0 0 

コードを翻訳しようとしました

fields = ['StudentID', 'Grade'] 
path= 'C:/script_testing/' 
i=0 

parse = lambda f: pd.read_csv(f, usecols=fields) 
table3 = pd.concat(
    [parse(f) for f in glob.glob('C:/script_testing/**/*.txt', recursive=True)] 
).pipe(lambda d: pd.crosstab(d.StudentID, d.Grade)) 

writer = pd.ExcelWriter('Report.xlsx', engine='xlsxwriter') 
table3.to_excel(writer, sheet_name='StudentID_vs_Grade') 
writer.save() 
+0

ありがとうございました!出来た。 1つのフォローアップの質問をしてください。 glob.gob()から読み込むときにいくつかのファイルを除外する方法はありますか?たとえば、ファイル名がData *、txtのすべてのファイルを読み込みますが、Data * Old.txtを持つファイルは除外しますか? –

+0

ようこそ。それは 'glob'問題です。 fの '' DataOld ''でなければglob.glob( 'C:/ script_testing/**/Data * .txt '、recursive = True)の' [parse(f) – piRSquared

関連する問題