我有2个pandas数据帧,每个都有一个dtype object
的索引,在这两个数据帧中我都可以看到值533
。但是,当我加入它们时,结果为空,因为其中一个是数字533
,另一个是字符串"533"
。
我发现了一种非常麻烦的事先知道不能匹配的方法。我尝试df.loc["533"]
和df.loc[533]
并等待哪一个会失败......
必须有更好的方法,对吧?
答案 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)