根据对象的类型(即str)从DataFrame中选择行

时间:2016-09-01 15:26:20

标签: python pandas

所以有一个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]

这显然不起作用!

谢谢,请帮助!

3 个答案:

答案 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()]