2015-11-19 13 views
13

Python pandasを使ってフォルダ内のすべてのcsvファイルを追加(マージ)します。例えばパンダのデータフレームを追加するときに列の順序が変わるのはなぜですか?

次のように言ってやるが、フォルダを2つのcsvファイルtest1.csvtest2.csvを持っています

A_Id P_Id CN1   CN2   CN3 
AAA  111  702   709   740 
BBB  222  1727  1734  1778 

A_Id P_Id CN1   CN2   CN3 
CCC  333  710  750   750 
DDD  444  180  734   778 

次のようにだから私が書いたPythonスクリプトだった:

#!/usr/bin/python 
import pandas as pd 
import glob 

all_data = pd.DataFrame() 
for f in glob.glob("testfolder/*.csv"): 
    df = pd.read_csv(f) 
    all_data = all_data.append(df) 

all_data.to_csv('testfolder/combined.csv') 

combined.csvには次のように行を付加し、それが見えます:

 CN1  CN2   CN3 A_Id P_Id 
    0 710  750   750  CCC  333 
    1 180  734   778  DDD  444  
    0 702  709   740  AAA  111 
    1 1727  1734  1778 BBB  222 

それは次のようになりますよう:最初の2列は、最後に移動され、なぜ

A_ID P_Id CN1 CN2 CN2 
AAA 111 702 709 740 
BBB 222 1727 1734 1778 
CCC 333 110 356 123 
DDD 444 220 256 223 
  • なぜ最後の行ではなく最初の行に追加されますか?

私は何が欠けていますか?そして、最初の列に0と1をどうやって得ることができますか?

P.S:これらは大きなcsvファイルなので、私はパンダを使用することを考えました。

+1

パンダのどのバージョンを使用していますか?それは0.17.0でうまく動作するからです。 – jezrael

+1

私は問題がcsvのフォーマットであると思っています - 行 'df = pd.read_csv(f)'の後に '' print df.head() 'をチェックしてみてください。 – jezrael

+1

出力は入力ディレクトリ 'all_data.to_csv( 'testfolder/combined.csv')'に書き込まれているので、出力を 'glob.glob(" testfolder/*。csv "):'という入力として読み込んでいると思います。ディレクトリを 'all_data.to_csv( 'out/combined.csv')に変更する – jezrael

答えて

0

私は以下のようにコードを微調整しました。インラインでのコメント。

#!/usr/bin/python 
import pandas as pd 
import glob 

# Grab all the csv files in the folder to a list. 
fileList = glob.glob('input_folder/*.csv') 

#Initialize an empty dataframe to grab the csv content. 
all_data = pd.DataFrame() 

#Initialize an empty list to grab the dataframes. 
dfList= [] 

for files in fileList: 
    df = pd.read_csv(files, index_col = None, header= False) 
    dfList.append(df) 

#The frames will be in reverse order i.e last read file's content in the begining. So reverse it again 
Reversed_dfList = dfList[::-1] 
CombinedFrame = pd.concat(Reversed_dfList) 

# The "Combined.csv" file will have combination of all the files. 
CombinedFrame.to_csv('output_folder/Combined.csv', index=False) 
7

私は同じ問題を持っていたし、それがpainfullた

all_data = all_data.append(df)[df.columns.tolist()] 
+3

このコードは質問に答えるかもしれませんが、このコードが質問に答える理由と理由についての追加の文脈を提供することで、長期的な価値が向上します。コードのみの回答はお勧めできません。 – Ajean

+3

これはおそらく提出する必要があるパンダのバグでしょうか?私も同じ問題がありました。 – user1761806

+1

質問は私が賢明に言っていた質問は "なぜ"です。 2つのデータフレームが異なる列を持つ場合、これは役に立ちません。私はpd.concatでも同じ問題を見ることができます – mm441

2

.....これを試してみてください。最終的なデータフレームに追加された後、元のデータフレームに基づいて列を再編成することで、その問題を解決しました。あなたの問題は、ほぼ2年前から、私も同様の問題に直面するだろう、他のenyoneのために私のために働いた解決策を掲載していたので

#!/usr/bin/python 
import pandas as pd 
import glob 

all_data = pd.DataFrame() 
for f in glob.glob("testfolder/*.csv"): 
    df = pd.read_csv(f) 
    all_data = all_data.append(df) 
    all_data = all_data[df.columns] 

all_data.to_csv('testfolder/combined.csv') 

:それは次のようになります。

関連する問題