我不明白为什么这段代码不起作用?我试图迭代一个数据帧,在这种情况下只有一个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)
答案 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 元组的元素。