首页 > 解决方案 > DataFrame中的for循环

问题描述

我有多个包含大量数据和 19 列的文件。我正在尝试多个 for 循环并将其设置为等于文件中的第一列、第二列等。

import numpy as np
import glob
import pandas as pd

#

lat=np.zeros(90)
long=np.zeros(180)
indat=np.zeros(19)

#

file_in = glob.glob('filenames*.dat'). 
for a in range(140):
   for i in range (90):
       for j in range (180):
            df = pd.DataFrame()
            for f in file_in:
                cols = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] #there are nineteen columns 
                indat = df.append(pd.read_csv(f, delimiter='\\s+', header=None, usecols=cols, skiprows=4), ignore_index=True)
                lat[i]=indat[0] # error here
                long[j]=indat[1]
               #updates some code here
                if i >=70:
                   dens[a,j,i-70]=indat[2]

它给了我这个错误: ValueError: setting an array element with a sequence.

更新:

indat有 19 列,许多文件,但所有格式都是相同的。

样本indat

#columns
#0   1    2      3 ..... 19 
-90  0   2e-12  #just some number
-90  2   3e-12  #just some number
-90  4   4e-12  #just some number
...
-90  360 1e-12  #just some number  
-88  0   1e-11  #just some number
-88  2   2e-11  #just some number
-88  4   3e-11  #just some number
...
-88  360 4e-11  #just some number 
...
90   0   2.5e-12  #just some number
90   2   3.5e-11  #just some number
90   4   4.5e-12  #just some number
...
90   360 1.5e-12  #just some number 

编辑:我根据每个人的建议清理代码

import numpy as np
import glob
import pandas as pd

file_in = glob.glob('filenames*.dat'). 
df = pd.DataFrame()
for f in file_in:
    cols = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
    indat = pd.read_csv(f, delimiter='\\s+', header=None, usecols=cols, skiprows=4)

for a in range(140):
   for i in range (90):
       for j in range (180):
           lat[i]=indat[0] # error here
           long[j]=indat[1]
           if i >=70:
              dens[a,j,i-70]=indat[2]

标签: python-3.xpandasnumpydataframefor-loop

解决方案


您尝试将列 ( pandas series)分配给向量indat[0]的元素numpylat[i]

另外,indat=np.zeros(19)稍后将其覆盖为数据框的意义何在?

内容是indat[0]什么?

这行代码

indat = df.append(pd.read_csv(f, delimiter='\\s+', header=None, usecols=cols, skiprows=4), ignore_index=True)

基本相同

indat = pd.read_csv(f, delimiter='\\s+', header=None, usecols=cols, skiprows=4)

因为df从未改变,即它始终是一个空数据框

由于内容indat未知,因此很难修复您的代码。如果你只是想让它运行没有错误,我建议写

lat[i] = indat[0].values[0] # take the first value of the vector
long[i] = indat[1].values[0] # take the first value of the vector

学习一些关于 Numpy 和 Pandas 的教程很好,因为如果没有一些基本的理解,它可能会非常混乱。


推荐阅读