2017-04-12 63 views
3

如果我有一個pandas.DataFrame與(例如int64float64)不同類型的列,從與.loc索引的int柱得到一個單一的元件將輸出到float的.loc索引改變鍵入

import pandas as pd 
df_test = pd.DataFrame({'ints':[1,2,3], 'floats': [4.5,5.5,6.5]}) 

df_test['ints'].dtype 
>>> dtype('int64') 

df_test.loc[0,'ints'] 
>>> 1.0 

type(df_test.loc[0,'ints']) 
>>> numpy.float64 

如果我用.at索引,它不會發生:

type(df_test.at[0,'ints']) 
>>> numpy.int64 

也當所有列int不會發生:

df_test = pd.DataFrame({'ints':[1,2,3], 'ints2': [4,5,6]}) 
df_test.loc[0,'ints'] 
>>> 1 

這是pandas索引的一些核心屬性的後果嗎?換句話說,它是一個功能的錯誤嗎? :)

更新:原來,it is a bug它將被固定在pandas 0.20.0

+2

我認爲這是與'loc'隱含試圖返回一行,即使你只有一個單一的價值做了GitHub的問題返回dtype被升級到可以表示這些行值的dtype – EdChum

+1

@EdChum,IMO這是一個正確的答案。你爲什麼不把它作爲一個小演示答案? – MaxU

+2

@MaxU當然會發帖 – EdChum

回答

2

這裏的問題是,loc隱式地試圖返回Series最初即使你返回從該行的dtype一列,因此標量值被upcasted到將支持所有dtypes一個D型行,如果你選擇的只是列,並使用loc那就不是轉換這樣的:

In [83]: 
df_test['ints'].loc[0] 

Out[83]: 
1 

你可以看到,當你不子選擇會發生什麼:

In [84]: 
df_test.loc[0] 

Out[84]: 
floats 4.5 
ints  1.0 
Name: 0, dtype: float64 

這可能是不可取的,我認爲有可能對本

issue是有點相關

+0

謝謝!這個問題確實相關。有趣的是,如果第二列是「str」,它不會向單個值上傳「object」,所以'.loc'可以正常工作。它只在你實際上出了一個'Series'時才起作用,就像你的例子。 –

+0

你認爲我應該在Github的線程中鏈接這個問題,以顯示出現的另一個情況嗎? –

+0

是的,我認爲這是值得顯示的不一致,像你說的 – EdChum