pandas对象索引可以是string或int,我怎么能区分它们?

时间:2015-09-13 07:13:57

标签: python pandas types

我有2个pandas数据帧,每个都有一个dtype object的索引,在这两个数据帧中我都可以看到值533。但是,当我加入它们时,结果为空,因为其中一个是数字533,另一个是字符串"533"

我发现了一种非常麻烦的事先知道不能匹配的方法。我尝试df.loc["533"]df.loc[533]并等待哪一个会失败......

必须有更好的方法,对吧?

2 个答案:

答案 0 :(得分:3)

区分它们的最佳方法是使用Index对象配备的“is_type”方法。这使您可以推断索引所持有的值的类型,因此加入/重建索引是否会为您提供所期望的结果。

另一种方法可能是直接检查索引的dtype,但在比较int类型索引和对象时,这会给你 false-negative 结果-type索引只包含整数。

这是一个包含四个Index对象的示例,用于突出显示“is_type”方法:

idx1 = pd.Index([0, 1, 2, 3, 4])             # int64 dtype
idx2 = pd.Index(['0','1','2','3','4'])       # object dtype, strings
idx3 = pd.Index([0,'1',2,'3',4])             # object dtype, ints and strings
idx4 = pd.Index([0, 1, 2, 3, 4], dtype='O')  # object dtype, holds ints

您的问题主要是检查索引是否包含字符串或整数。在这种情况下,您可以使用is_integer()

>>> idx1.is_integer()
True
>>> idx2.is_integer()
False

由于idx2至少包含一个字符串,因此检查将返回False。所以你知道加入/重新索引像idx1这样的整数索引是行不通的。

但是,对于仅包含 整数的对象dtype索引,相同的检查将返回True(因此,使用idx1加入/重新索引将成功):

>>> idx4.is_integer()
True

另一个有用的检查是is_mixed(),它可以让你检查索引(对象dtype)是否包含不同类型的混合:

>>> idx3.is_mixed()
True

作为参考,所有Index个对象的可用类型推断方法是:

is_all_dates
is_boolean
is_categorical
is_floating
is_integer
is_mixed
is_numeric
is_object

答案 1 :(得分:1)

# String index
df1 = pd.DataFrame({'A': [1, 2, 3]}, index = ["1", "2", "3"])

# Int index
df2 = pd.DataFrame({'A': [1, 2, 3]}, index = [1, 2, 3])

# Convert string index to integers:
df1.index = df1.index.astype(int)

# Convert integer index to strings:
df2.index = df2.index.astype(str)