2016-04-13 7 views
1

私のプロジェクトでは、米国のすべての州のデータを含むcsvファイルを読み込んでいます。私の機能は、各州の情報に関する操作を実行する必要があるため、これらのそれぞれを個別のDataframeに変換します。複数のデータフレームを反復処理して、それぞれの列をPythonで選択するにはどうすればよいですか?

def RanktoDF(csvFile): 
    df = pd.read_csv(csvFile) 
    df = df[pd.notnull(df['Index'])] # drop all null values 
    df = df[df.Index != 'Index'] #Drop all extra headers 
    df= df.set_index('State') #Set State as index 
    return df 

は、私は私のファイルの一人一人に、この機能を適用し、私の配列から名前でDFを返すことのすべてが完璧に動作

for name , s in zip (glob.glob('*.csv'), varNames): 
    vars()["Crime" + s] = RanktoDF(name) 

varNames。 私の問題は、それぞれの状態データフレームから1つの列で構成されたデータフレームを作成したいということです。

私は自分のデータフレームのリストを反復処理し、列(人口)私は新しいデータフレームにそれを追加したいを選択しようとしている:

dfList

dfNewIndex = pd.DataFrame(index=CrimeRank_1980_df.index) # Create new DF with Index 


for name in dfList: #dfList is my list of dataframes. See image 
    newIndex = name['Population'] 
    dfNewIndex.append(newIndex) 

    #dfNewIndex = pd.concat([dfNewIndex, dfList[name['Population']], axis=1) 

私の誤差は常に同じです名前が実際のデータフレームではなく文字列として表示されることを教えてください

TypeError         Traceback (most recent call last) 
<ipython-input-30-5aa85b0174df> in <module>() 
     3 
     4 for name in dfList: 
----> 5  newIndex = name['Index'] 
     6  dfNewIndex.append(newIndex) 
     7 #  dfNewIndex = pd.concat([dfNewIndex, dfList[name['Population']], axis=1) 

TypeError: string indices must be integers 

私のリストは文字列リストではなく、変数/データフレームので、私の質問は、私が望むやり方をするために自分のコードを修正したり、これを行う簡単な方法は何ですか?

私が調べた解決策は、データフレームを連結するためにデータフレームを明示的に入力するところの回答を与えていますが、私は50を持っていますので、少ししか実行できません。どんな助けもありがとう。

+0

dfListのオブジェクトがデータフレーム型であることを確認してください。なぜなら、それは前記データフレームの名前だけであると思われ、エラーは完全に意味をなさないからです。 – Aquiles

+0

この行が正常に動作していることを確認してください: 'df = df [df.Index!= 'Index']#すべての余分なヘッダーをダンプする ' – Alexander

+0

@Alexanderそうです。それは私のCSVファイルの奇妙な3つのテーブルの合併が互いの上に積み重なったことです。彼らは同じヘッダーを持っているので、インデックスの列から「インデックス」を削除することによって、それらの他のヘッダーをすべて削除し、 。あなたの返信ありがとう – DaithiOK

答えて

3

1つの方法は、vars()にインデックスを付けることです。

for name in dfList: 
    newIndex = vars()[name]["Population"] 

代わりに私は例えば、容器の中にあなたのデータフレームを保存し、それを反復処理するために滑らかな印象だと思います

frames = {} 

for name, s in zip(glob.glob('*.csv'), varNames): 
    frames["Crime" + s] = RanktoDF(name) 

for name in frames: 
    newIndex = frames[name]["Population"] 
+1

Upvoteは2番目のアプローチです。また、辞書の理解を使用することもできます: 'frames = {" Crime "+ s:名前のランクDF(name)、zip(glob.glob( '*。csv')、varNames)}' – Alexander

+0

@James thats greatどうもありがとうございます。私はコンテナを使っていますが、それはもっと意味があります。助けを感謝する – DaithiOK

関連する問題