Pandas for loop over dataframe дает слишком много значений для распаковки - PullRequest
0 голосов
/ 09 мая 2018

Не понимаю, почему этот код не работает? Я пытаюсь перебрать кадр данных, который в этом случае имеет только одну строку в цикле? Есть только два столбца, и у меня есть два для переменных цикла, чтобы взять их? что мне не хватает, пожалуйста?

  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 голосов
/ 09 мая 2018

pd.DataFrame.itertuples возвращает итерацию именованных кортежей , включая индекс по умолчанию .

Для этого есть две возможности.

Вариант 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

Поведение указано в документации :

DataFrame. itertuples ( index = True, name = 'Pandas' )

Итерация по строкам DataFrame как именованных кортежей со значением индекса первым элемент кортежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...