2016-04-13 35 views
1

Projem için ABD'deki her Devletten veri içeren bir csv dosyasında okuyorum. Fonksiyonum, her bir Devletin bilgileri üzerinde işlem yapmam gerektiğinden bunların her birini ayrı bir Dataframe'e dönüştürür.Python'da her birinde bir sütun seçmek için birden çok veri çerçevesinden nasıl yineleyebilirim?

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 

benim dosyaların her biri için bu işlevi uygulamak ve benim diziden bir adla df dönmek Bunların hepsi mükemmel çalışıyor

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

varNames. Benim sorunum, aynı zamanda bu Durum Veri Çerçevelerinin her birinden bir sütundan oluşan bir Veri Çerçevesi oluşturmak istiyorum.

benim dataframes listesi içinde yineleme ve kolon (nüfus) i yeni Dataframe bunu eklemek istediğiniz seçerek denedi:

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) 

Benim hata hep aynı olan bana söyler isim bir dize yerine gerçek bir Dataframe olarak görülüyor benim liste Strings listesi oldukça inci olduğunu anlıyoruz

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 

bir değişken/dataframe, bu yüzden benim istediğim şeyi yapabilmek için kodumu nasıl düzeltebilirim veya bunu yapmanın daha kolay bir yolu var mı?

Baktığım tüm çözümler, veri tabanlarının birleştirilebilmesi için açık bir şekilde yazıldığı yerlerde yanıtlar vermişti, ancak 50 tane benim için çok düşük. Herhangi bir yardım takdir edilecektir.

+0

dfList'deki nesnelerin veri türü olduğundan emin misiniz? çünkü sadece söz konusu veri tabanlarının isimleri gibi görünüyor ve hata tümüyle anlam ifade ediyor. – Aquiles

+0

size beklendiği gibi bu hat çalıştığından emin misiniz: 'df = df [! Df.Index = 'Dizin'] #Drop tüm ekstra headers' – Alexander

+0

@Alexander Evet öyle. Benim CSV dosyasının Onun bir cilvesi olduğunu Onun aynı başlıkları other.They her üst üste 3 tablolar bir birleşmesi yüzden tüm diğer başlıkları kaldırın ve sadece ilkinden kaldım Endeksi sütundan kaldırarak 'Index' tarafından . Cevabınız için teşekkürler. – DaithiOK

cevap

3

bir şekilde) (değişkenler halinde dizine olacaktır, ör

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

Alternatif ben, örneğin bir kap içinde dataframes depolamak ve bu yineleme yapmak kıvrımlara olacağını düşünüyorum

frames = {} 

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

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

Son bildirim, ikinci yaklaşım içindir. 'Çerçeveleri =: Ayrıca bir sözlük anlama kullanabilirsiniz { "Suç" + s: (. Glob.glob(), varNames '* csv.') Adını RanktoDF (isim), zip s}' – Alexander

+0

@James hoş güzel cazip çok teşekkür ederim. Konteyneri de kullanacağım, bu şekilde daha mantıklı. Yardımı takdir et – DaithiOK