2017-07-25 105 views
3

时重命名数据帧列我知道通常如下大熊猫itertuples()将返回每个包括列名的值:熊猫df.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 

以上是以Timestamp为索引的Pandas Dataframe,列表中的值为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()生成的数据类型应该是元组,但是看起来(如上所示),返回类型是从类型语句验证的)?

感谢您的耐心等待,因为我仍然在努力掌握DataFrame的应用。

+0

'data.columns'说什么? –

+0

@Willem凡Onsem 它说'指数([“我们QQQ权益”,“美国间谍股权”],D类=“对象”)' – user7786493

回答

3

这似乎是处理列名中有空格的问题。如果您要更换不同的人列名不带空格,它将工作:用空格

In [732]: df.columns = ['us_qqq_equity', 'us_spy_equity'] 

In [733]: 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) 
Pandas(Index='2017-06-21', us_qqq_equity=0.0, us_spy_equity=0.0) 
Pandas(Index='2017-06-22', us_qqq_equity=0.0, us_spy_equity=0.0) 
Pandas(Index='2017-06-23', us_qqq_equity=1.0, us_spy_equity=0.0) 

列名不能有效地在一个名为元组来表示,所以在打印时,它们会自动重命名。


在列名(礼貌MaxU)替换空间的更灵活的方式被使用df.columns.str.replace

df.columns = df.columns.str.replace(r'\s+', '_') 
+1

我们可以用一个更灵活一点的方式重命名列:'df.columns = df.columns.str.replace(r'\ s +','_')' – MaxU

+0

@ COLDSPEED 这真是太神奇了。我几乎不知道自己。我的后续问题是这是一个错误还是正常的行为?基本上itertuples()返回的数据类型是什么?它显示''但是这里的每个人都说元组(或者我不熟悉的名字元组)。任何人都可以向我解释这是什么类型的数据,为什么这种类型的数据不占用空间? – user7786493

+0

@ user7786493我不是100%它是什么类型,但我几乎肯定它是['collections.namedtuple']的味道(https://docs.python.org/2/library/collections.html#collections 。namedtuple),这是这些内在的限制。 –

1

有趣的观察:选自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)] 
+0

同意。感谢@MaxU指出。我关注itertuples()的原因(如果我错了,请纠正我),因为如果我们试图迭代数据帧的行,循环时间应该是3个选项中最短的。除非有其他更快的选择? – user7786493

+0

@ user7786493,欢迎您。在Pandas中处理数据的最快方式是使用__vectorized__方法/函数,并避免使用for循环,.apply(),.applymap()等。 – MaxU

+0

好的。此外,@ user7786493我同意Max。如果你正在对所有元素进行操作,我建议你使用apply/transform/map。 –