根据对象类型(即str)从数据框中选择行

2024-06-06 18:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

所以有一个数据框说:

>>> 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类型的行。

例如,我想选择列A中数据的typestr的行。 所以它应该打印如下内容:

   A      B
2  Three  3

其直观代码如下:

df[type(df.A) == str]

这显然不起作用!

谢谢,请帮忙!


Tags: 数据代码类型内容dataframedftype直观
3条回答

这是有效的:

df[df['A'].apply(lambda x: type(x)==str)]

你可以做一些类似于你所要求的事情

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

为什么只有相似的?因为Pandas将内容存储在同一列中(列中的所有条目都属于同一类型)。即使您是从异类类型构造数据帧的,但它们都被制成列,每个列都是最低的公分母:

In [16]: df.A.dtype
Out[16]: dtype('O')

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

使用一个序列来保存混合的数值类型和非数值类型通常是一个坏主意。这将导致您的序列具有dtypeobject,它只不过是一个指针序列。与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()]

相关问题 更多 >