我正在使用一个预期仅包含浮点类型索引值的DataFrame,但是我怀疑由于某种原因,存在其他类型的值,从而导致索引的dtype='object'
类型。我想提取不是浮点类型的索引值,看看是否是这种情况。
示例
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}, index=[0.0,1.5,'a'])
在这种情况下,提取的结果将是一个包含单个元素['a']
的列表。
答案 0 :(得分:4)
您是否只想弄清楚您拥有哪种假数据?如果是这样,就足够了。
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
答案 1 :(得分:3)
将isinstance
与map
一起使用:
idx = df.index[(df.index.map(lambda x: isinstance(x, float)) == False)]
print (idx)
Index(['a'], dtype='object')
答案 2 :(得分:2)
具有列表理解功能-根据Coldspeeds建议进行了更新:
[x for x in df.index if not isinstance(x, float)]
答案 3 :(得分:1)
您可以使用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')]})