Pandas df.itertuples打印时重命名数据框列

use*_*493 6 python iteration dataframe pandas

我知道通常熊猫的itertuples()将返回每个值,包括列名,如下所示:

ab=pd.DataFrame(np.random.random([3,3]),columns=['hi','low','med'])
for i in ab.itertuples():
    print(i)
Run Code Online (Sandbox Code Playgroud)

输出如下:

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)
Run Code Online (Sandbox Code Playgroud)

但是,我不知道为什么它不按我的另一组代码显示如下所示的列:

            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
Run Code Online (Sandbox Code Playgroud)

上面是一个以时间戳记为索引,float64为列表中的值以及字符串['us qqq equity,'us spy equity']列表的Pandas Dataframe。

当我这样做时:

for row in data.itertuples():
    print (row)
Run Code Online (Sandbox Code Playgroud)

它将列显示为_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)
Run Code Online (Sandbox Code Playgroud)

有人知道我做错了什么吗?创建原始数据框时是否与某些变量引用问题有关?(此外,作为一个附带的问题,我从社区了解到,从itertuples()生成的数据类型应该是元组,但看起来(如上所示),返回类型是否如我从类型语句中验证的那样?)

感谢您的耐心配合,因为我仍在尝试掌握DataFrame的应用程序。

cs9*_*s95 5

处理带有空格的列名称似乎是一个问题。如果将列名替换为其他不带空格的名称,它将起作用:

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)
# ...
Run Code Online (Sandbox Code Playgroud)

带空格的列名称无法有效地在命名元组中表示,因此在打印时会自动重命名。

  • 我们可以使用一种更灵活的方式来重命名列:`df.columns = df.columns.str.replace(r'\ s +','_')` (2认同)