我知道通常pandas的itertuples()会返回每个包含列名的值,如下所示:
ab=pd.DataFrame(np.random.random([3,3]),columns=['hi','low','med'])
for i in ab.itertuples():
print(i)
,输出如下:
Pandas(Index=0, hi=0.05421443, low=0.2456833, med=0.491185)
Pandas(Index=1, hi=0.28670429, low=0.5828551, med=0.279305)
Pandas(Index=2, hi=0.53869406, low=0.3427290, med=0.750075)
但是,我不知道为什么它没有按照我预期的另一组代码显示列,如下所示:
us qqq equity us spy equity
date
2017-06-19 0.0 1.0
2017-06-20 0.0 -1.0
2017-06-21 0.0 0.0
2017-06-22 0.0 0.0
2017-06-23 1.0 0.0
2017-06-26 0.0 0.0
2017-06-27 -1.0 0.0
2017-06-28 1.0 0.0
2017-06-29 -1.0 0.0
2017-06-30 0.0 0.0
上面是一个Pandas Dataframe,其中Timestamp作为索引,float64作为列表中的值,以及字符串['us qqq equity','us spy equity']列表作为列。
当我这样做时:
for row in data.itertuples():
print (row)
它将列显示为_1和_2,如下所示:
Pandas(Index=Timestamp('2017-06-19 00:00:00'), _1=0.0, _2=1.0)
Pandas(Index=Timestamp('2017-06-20 00:00:00'), _1=0.0, _2=-1.0)
Pandas(Index=Timestamp('2017-06-21 00:00:00'), _1=0.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-22 00:00:00'), _1=0.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-23 00:00:00'), _1=1.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-26 00:00:00'), _1=0.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-27 00:00:00'), _1=-1.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-28 00:00:00'), _1=1.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-29 00:00:00'), _1=-1.0, _2=0.0)
Pandas(Index=Timestamp('2017-06-30 00:00:00'), _1=0.0, _2=0.0)
有没有人知道我做错了什么?在创建原始数据帧时是否与某些变量引用问题有关? (另外,作为一个附带问题,我从社区中了解到,itertuples()生成的数据类型应该是元组,但似乎(如上所示),返回类型是我从类型语句验证的?)< / p>
感谢您的耐心,因为我仍在努力掌握DataFrame的应用。
答案 0 :(得分:4)
这似乎是处理列名中包含空格的问题。如果用不同的空格替换列名称,它将起作用:
df.columns = ['us_qqq_equity', 'us_spy_equity']
# df.columns = df.columns.str.replace(r'\s+', '_') # Courtesy @MaxU
for r in df.head().itertuples():
print(r)
# Pandas(Index='2017-06-19', us_qqq_equity=0.0, us_spy_equity=1.0)
# Pandas(Index='2017-06-20', us_qqq_equity=0.0, us_spy_equity=-1.0)
# ...
带有空格的列名无法在命名元组中有效表示,因此在打印时会自动重命名。
答案 1 :(得分:2)
有趣的观察:DataFrame.iterrows()
,DataFrame.iteritems()
,DataFrame.itertuples()
只有最后一个重命名列,包含空格:
In [140]: df = df.head(3)
In [141]: list(df.iterrows())
Out[141]:
[(Timestamp('2017-06-19 00:00:00'), us qqq equity 0.0
us spy equity 1.0
Name: 2017-06-19 00:00:00, dtype: float64),
(Timestamp('2017-06-20 00:00:00'), us qqq equity 0.0
us spy equity -1.0
Name: 2017-06-20 00:00:00, dtype: float64),
(Timestamp('2017-06-21 00:00:00'), us qqq equity 0.0
us spy equity 0.0
Name: 2017-06-21 00:00:00, dtype: float64)]
In [142]: list(df.iteritems())
Out[142]:
[('us qqq equity', date
2017-06-19 0.0
2017-06-20 0.0
2017-06-21 0.0
Name: us qqq equity, dtype: float64), ('us spy equity', date
2017-06-19 1.0
2017-06-20 -1.0
2017-06-21 0.0
Name: us spy equity, dtype: float64)]
In [143]: list(df.itertuples())
Out[143]:
[Pandas(Index=Timestamp('2017-06-19 00:00:00'), _1=0.0, _2=1.0),
Pandas(Index=Timestamp('2017-06-20 00:00:00'), _1=0.0, _2=-1.0),
Pandas(Index=Timestamp('2017-06-21 00:00:00'), _1=0.0, _2=0.0)]