Python-从pandas.DataFrame使用复杂条件选择

发布于 2021-02-02 23:14:53

例如,我有简单的DF:

import pandas as pd
from random import randint

df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
                   'B': [randint(1, 9)*10 for x in xrange(10)],
                   'C': [randint(1, 9)*100 for x in xrange(10)]})

我可以使用熊猫的方法和惯用法从“ A”中选择与B对应的值大于50的值,对于C对应的值大于900的值吗?

关注者
0
被浏览
85
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    当然!设定:

    >>> import pandas as pd
    >>> from random import randint
    >>> df = pd.DataFrame({'A': [randint(1, 9) for x in range(10)],
                       'B': [randint(1, 9)*10 for x in range(10)],
                       'C': [randint(1, 9)*100 for x in range(10)]})
    >>> df
       A   B    C
    0  9  40  300
    1  9  70  700
    2  5  70  900
    3  8  80  900
    4  7  50  200
    5  9  30  900
    6  2  80  700
    7  2  80  400
    8  5  80  300
    9  7  70  800
    

    我们可以应用列操作并获取布尔系列对象:

    >>> df["B"] > 50
    0    False
    1     True
    2     True
    3     True
    4    False
    5    False
    6     True
    7     True
    8     True
    9     True
    Name: B
    >>> (df["B"] > 50) & (df["C"] == 900)
    0    False
    1    False
    2     True
    3     True
    4    False
    5    False
    6    False
    7    False
    8    False
    9    False
    

    [更新,切换到新样式.loc]:

    然后,我们可以使用它们来索引对象。对于读取访问,可以链接索引:

    >>> df["A"][(df["B"] > 50) & (df["C"] == 900)]
    2    5
    3    8
    Name: A, dtype: int64
    

    但是由于视图和执行写操作的副本之间的差异,您可能会遇到麻烦。您可以.loc改用:

    >>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"]
    2    5
    3    8
    Name: A, dtype: int64
    >>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"].values
    array([5, 8], dtype=int64)
    >>> df.loc[(df["B"] > 50) & (df["C"] == 900), "A"] *= 1000
    >>> df
          A   B    C
    0     9  40  300
    1     9  70  700
    2  5000  70  900
    3  8000  80  900
    4     7  50  200
    5     9  30  900
    6     2  80  700
    7     2  80  400
    8     5  80  300
    9     7  70  800
    

    请注意,我不小心输入了== 900not != 900和或~(df[“C”] == 900),但我懒得修复它。为读者练习。:^)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看