2017-04-12 61 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