【问题标题】:filtering a data frame in pandas过滤熊猫中的数据框
【发布时间】:2015-03-09 10:21:45
【问题描述】:

我有一个数据框如下:

dic ={'wteam': [2, 3, 4, 2, 4], 'lteam': [3, 4, 2, 4, 2]}
pd.DataFrame(dic) 

   lteam  wteam
0    3      2
1    4      3
2    2      4
3    4      2
4    3      4

我需要一个在 lteam 或 wteam 中有 2 个的新数据框。

        lteam  wteam
    0    3      2
    2    2      4
    3    4      2

如何在熊猫中做到这一点?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    您的起始 df 的输出是错误的,最后一行应该是 [2,4],除此之外,我们可以在布尔过滤 df 生成的索引上调用 loc 并删除任何 NaN 值:

    In [15]:
    
    df.loc[df[df==2].dropna(thresh=1).index]
    Out[15]:
       lteam  wteam
    0      3      2
    2      2      4
    3      4      2
    4      2      4
    

    分解:

    In [16]:
    
    df[df==2]
    Out[16]:
       lteam  wteam
    0    NaN      2
    1    NaN    NaN
    2      2    NaN
    3    NaN      2
    4      2    NaN
    In [17]:
    
    df[df==2].dropna(thresh=1)
    Out[17]:
       lteam  wteam
    0    NaN      2
    2      2    NaN
    3    NaN      2
    4      2    NaN
    

    更简洁的方法是提供 2 个布尔条件:

    In [18]:
    
    df[(df.lteam == 2) | (df.wteam == 2)]
    Out[18]:
       lteam  wteam
    0      3      2
    2      2      4
    3      4      2
    4      2      4
    

    由于运算符优先级,这需要使用按位 | 运算符和括号括起来的条件

    如果您有很多列,第一种方法会更好,但对于您的简单数据集,后一种方法会很好。

    【讨论】:

    • 有什么区别 |和或
    • 你不能在数组中使用or,如果你尝试这个你会得到一个错误ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().这是因为你试图比较所有的值但是如果说一个或多个值是不明确的匹配,请参见:pandas.pydata.org/pandas-docs/dev/gotchas.html
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2019-04-13
    • 2015-05-28
    • 2018-02-06
    • 2018-09-28
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多