【问题标题】:Select row from a DataFrame based on the type of the object(i.e. str)根据对象的类型(即 str)从 DataFrame 中选择行
【发布时间】:2020-01-13 23:39:13
【问题描述】:

所以有一个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类型的行。

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

   A      B
2  Three  3

谁的直观代码会是这样的:

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

这显然行不通!

谢谢请帮忙!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这行得通:

    df[df['A'].apply(lambda x: isinstance(x, str))]
    

    【讨论】:

    • 永远不要使用type(obj) == typeobj。使用isinstance(obj, typeobj),或者如果必须排除子类,则使用type(obj) is typeobj(身份测试,而不是平等)。
    【解决方案2】:

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

    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')
    

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

    【讨论】:

    • 谢谢:) 但是isnull() 是怎么回事?它返回什么?
    • @wolframalpha 给定一个系列,它返回一个布尔系列,指示该系列的哪些条目中有空值。所以,首先我们使用to_numeric(在转换失败时放置一个空值),然后在结果上运行isnull
    • 我认为这应该是正确的答案,因为即使有一个字符串,整列也会是一个字符串。这种混合物太简单了,因此接受的答案奏效了。在现实生活中,这是一个救命稻草。
    • 这是最好和最快的解决方案(比应用 lambda 好得多);应该是公认的答案。
    【解决方案3】:

    使用系列来保存混合的数字和非数字类型通常是个坏主意。这将导致您的系列具有 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()]
    

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2017-09-23
      • 2022-11-25
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多