2017-07-25 141 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。 –