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

wol*_*pha 15 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
Run Code Online (Sandbox Code Playgroud)

我想选择特定列的特定行的数据类型是类型的行str.

比如我要选择的行,其中type在列中的数据Astr.所以它应该打印如下:

   A      B
2  Three  3
Run Code Online (Sandbox Code Playgroud)

谁的直观代码是这样的:

df[type(df.A) == str]
Run Code Online (Sandbox Code Playgroud)

这显然不起作用!

谢谢请帮忙!

DrT*_*TRD 18

这有效:

df[df['A'].apply(lambda x: type(x)==str)]
Run Code Online (Sandbox Code Playgroud)

  • 永远不要使用`type(obj)== typeobj`。使用`isinstance(obj,typeobj)`,或者如果必须排除子类,则`type(obj)为typeobj`(身份测试,不是相等性)。 (3认同)

Ami*_*ory 6

您可以执行要求类似的操作

In [14]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[14]: 
       A  B
2  Three  3
Run Code Online (Sandbox Code Playgroud)

为什么只相似?因为Pandas将事物存储在同类列中(列中的所有条目都是同一类型)。即使您是从异构类型构造DataFrame的,它们也都被制成具有最低公分母的各列:

In [16]: df.A.dtype
Out[16]: dtype('O')
Run Code Online (Sandbox Code Playgroud)

因此,您无法询问哪些行属于哪种类型-它们都属于同一类型。您可以做的是尝试将条目转换为数字,并检查转换失败的地方(这是上面的代码的作用)。


jpp*_*jpp 5

使用系列来保存混合数字和非数字类型通常是一个坏主意。这将导致您的系列具有 dtype object,它只不过是一个指针序列。非常相似list,事实上,此类系列上的许多操作都可以使用 更有效地处理list

通过此免责声明,您可以通过列表理解使用布尔索引:

res = df[[isinstance(value, str) for value in df['A']]]

print(res)

       A  B
2  Three  3
Run Code Online (Sandbox Code Playgroud)

等效的情况也可以使用pd.Series.apply,但这只不过是一个薄薄的循环,并且可能比列表理解慢:

res = df[df['A'].apply(lambda x: isinstance(x, str))]
Run Code Online (Sandbox Code Playgroud)

如果您确定所有非数字值必须是字符串,那么您可以转换为数字并查找空值,即无法转换的值:

res = df[pd.to_numeric(df['A'], errors='coerce').isnull()]
Run Code Online (Sandbox Code Playgroud)