如何迭代多个数据帧以在python中选择每个列中的列?

时间:2016-04-13 14:44:11

标签: python pandas dataframe analytics jupyter

对于我的项目,我正在阅读csv文件,其中包含来自美国各州的数据。我的函数将每个函数转换为一个单独的Dataframe,因为我需要对每个State的信息执行操作。

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 varNames

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

所有这一切都很完美。 我的问题是我还想创建一个由每个状态数据帧中的一列组成的数据帧。

我已经尝试遍历我的数据框列表并选择我希望将其附加到新数据框的列(填充):

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)

我的错误始终相同,它告诉我名称被视为字符串而不是实际的Dataframe

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个,所以它有点不可行。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

一种方法是索引到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"]