用于循环数据帧的Pandas为解压缩提供了太多值

时间:2018-05-08 22:31:12

标签: python python-3.x pandas dataframe

我不明白为什么这段代码不起作用?我试图迭代一个数据帧,在这种情况下只有一个for循环中的一行?只有两列,我有两个for循环变量来接受它们?我错过了什么?

  print("process_list =  ",process_list)

  for row in process_list.itertuples():
       print("row = ", row)


  df_to_date = pd.DataFrame()

  try:
        print("process_list = {}  and it's type {}  process_list.itertuples() {} ".format(process_list, type(process_list),process_list.itertuples() ) )

        for   file_date , file_name  in process_list.itertuples(): # a whole batch of days 
               file_to_process = dev_env + file_name
               print("PROCESSING BATCH: ",file_to_process)
               df  = pd.read_csv(file_to_process, header=None,skiprows=22, sep=',', comment='*', converters = {"Days" : just_number,"Percentile" : just_number,"Date" : just_number} ,names = column_names )
               df.insert(0,'File_date',file_date)
               df_to_date = df_to_date.append(df)

  except Exception as e: 
           print ("nothing to process exception = ",e)
           sys.exit(0)

当我跑它时,我得到了

process_list =       File_date          File_name
94   20180507  mcmhv20180507.csv
row =  Pandas(Index=94, File_date=20180507, File_name='mcmhv20180507.csv')
process_list =     File_date          File_name
94   20180507  mcmhv20180507.csv  and it's type <class 'pandas.core.frame.DataFrame'>  process_list.itertuples() <map object at 0x7f6339371e48> 
nothing to process exception =  too many values to unpack (expected 2)

1 个答案:

答案 0 :(得分:1)

pd.DataFrame.itertuples返回一个可复制的namedtuples ,包括默认情况下的索引

有两种方法可以解释这一点。

选项1

打开3件物品,而不是2件,第一件是您不使用的。

这是一个最小的例子:

df = pd.DataFrame([[10, 20], [30, 40], [50, 60]],
                  columns=['A', 'B'])

for idx, a, b in df.itertuples():
    print(idx, a, b)

0 10 20
1 30 40
2 50 60

在您的情况下,一个好的约定是用_表示未使用的变量:

for _, file_date, file_name in process_list[['date', 'name']].itertuples():
    # do something

选项2

使用index=False参数并解压缩2个元素:

for file_date, file_name in process_list[['date', 'name']].itertuples(index=False):
    # do something

行为显示在documentation

  

DataFrame。 itertuples index = True,name ='Pandas'

     

将DataFrame行迭代为namedtuples,索引值为first   元组的元素。