提取pandas中不浮动的DataFrame索引值

Extract the index values of DataFrame that are not float in pandas

我正在使用预计仅包含浮点类型索引值的 DataFrame,但我怀疑由于某种原因存在不同类型的值,导致索引的类型为 dtype='object'。我想提取非浮点类型的索引值,看看是否是这种情况。

示例

df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}, index=[0.0,1.5,'a'])

在这种情况下提取的结果将是一个包含单个元素的列表 ['a']

isinstancemap 一起使用:

idx = df.index[(df.index.map(lambda x: isinstance(x, float)) == False)]
print (idx)

Index(['a'], dtype='object')

您是否只想要一种方法来确定您拥有哪种虚假数据?如果是这样,这就足够了。

df.index[df.index.str[0].notna()]
Index(['a'], dtype='object')

假设您有字符串条目,任何不是字符串的内容都将显示为 NaN。

如果您想去除无效数据,请尝试将其强制浮动,并去除 NaN 行。

m = pd.to_numeric(df.index, errors='coerce').notna()  #.notnull()
df[m]
     a  b
0.0  1  4
1.5  2  5

使用列表理解 - 根据 Coldspeeds 推荐更新:

[x for x in df.index if not isinstance(x, float)]

您可以使用 collections.defaultdict 创建映射到值的类型字典:

from collections import defaultdict

df = pd.DataFrame({'a': [1,2,3,4,5], 'b': [4,5,6,7,8]},
                  index=[0.0,1.5,'a',pd.to_datetime('10/05/2018'),'b'])

vals = pd.to_numeric(df.index, errors='coerce')
idx = df.index[vals.isnull()]

d = defaultdict(list)

for x in idx:
    d[type(x)].append(x)

然后,例如,您可以使用 d.keys() 提取所有非数字类型,或 d[str] 提取字符串索引。

结果

print(d)

defaultdict(list,
            {str: ['a', 'b'],
             pandas._libs.tslibs.timestamps.Timestamp: [Timestamp('2018-10-05 00:00:00')]})