所以有一个DataFrame说:
>>> df = pd.DataFrame({
... 'A':[1,2,'Three',4],
... 'B':[1,'Two',3,4]})
>>> df
A B
0 1 1
1 2 Two
2 Three 3
3 4 4
我想选择特定列的特定行的数据类型为str
类型的行。
例如,我想选择type
列中A
数据为str
的行。
所以它应该打印如下:
A B
2 Three 3
直观的代码就像:
df[type(df.A) == str]
这显然不起作用!
谢谢,请帮助!
答案 0 :(得分:16)
这有效:
df[df['A'].apply(lambda x: type(x)==str)]
答案 1 :(得分:5)
你可以用你想要的类似来做
In [14]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[14]:
A B
2 Three 3
为什么只有类似?因为Pandas将事物存储在同类列中(列中的所有条目都是相同类型)。即使您是从异构类型构造DataFrame,它们都被制作成每个最低公分母的列:
In [16]: df.A.dtype
Out[16]: dtype('O')
因此,您无法询问哪些行是哪种类型 - 它们都属于同一类型。您可以做的是尝试将条目转换为数字,并检查转换失败的位置(这是上面的代码所做的)。
答案 2 :(得分:2)
使用系列来容纳数字和非数字混合类型通常是个坏主意。这将导致您的系列具有dtype object
,无非就是一系列指针。就像list
一样,实际上,list
可以更有效地处理该系列的许多操作。
使用此免责声明,您可以通过列表理解来使用布尔索引:
res = df[[isinstance(value, str) for value in df['A']]]
print(res)
A B
2 Three 3
pd.Series.apply
可以实现等效功能,但这仅是一个薄薄的循环,并且可能比列表理解要慢:
res = df[df['A'].apply(lambda x: isinstance(x, str))]
如果确定所有非数字值都必须是字符串,则可以转换为数字并查找空值,即无法转换的值:
res = df[pd.to_numeric(df['A'], errors='coerce').isnull()]