如何选择多个条件的行?

时间:2019-08-05 18:04:53

标签: python pandas dataframe

我想选择一些具有多个条件的行。我想即使其中一个条件为真,也选择了该行。

enter image description here

<FlatList data={this.state.data} keyExtractor={item => item.id}
    numColumns={columns}
    renderItem={({ item }) => {
        if (item.empty) {
            return <View style={[Cards.item, Cards.itemEmpty]} />;
        }
        return (<View style={[{ flex: 1 }]}>
            <TouchableOpacity onPress={() => this.onPressChangeColor(item.id)}
                style={[Cards.item, {
                    backgroundColor: "grey",
                    borderColor: "grey",
                    borderWidth: 2
                }]}>
            <Text style={[{ color: "white", textAlign: 'center', alignSelf: 'center' }]}>{item.name}</Text>
            </TouchableOpacity>
        </View>);
        }
    }
/>

我希望输出行具有至少一个条件,但在输出中,我具有没有任何这些条件的行。

我已经申请了:

def obtain(x):
    mask = (x['EucDistPoint'] >= x['EucDistPoint'].mean()) | (x['CRS'] >= 
            x['CRS'].mean()) | (x['CRC'] >= x['CRC'].mean())
    selected = x.loc[mask]
    return selected
selected = data.groupby('MMSI').apply(obtain)

但是当我想检查输出时,我使用了:

def obtain(x):
    mask = (x.EucDistPoint >= x.EucDistPoint.mean()) |\
        (x.CRS >= x.CRS.mean()) | (x.CRC >= x.CRC.mean())
    return x[mask]
selected = data.groupby('MMSI').apply(obtain) 

但是输出是这样的:

selected[selected['MMSI']==210161000].min()

这是错误的,因为CRS和CRC与EucDistPoint的最小值分别为0.0022、0.0446和551.887

1 个答案:

答案 0 :(得分:1)

您的代码按“原样”运行。您也可以将其写得短一些:

def obtain(x):
    mask = (x.EucDistPoint >= x.EucDistPoint.mean()) |\
        (x.CRS >= x.CRS.mean()) | (x.CRC >= x.CRC.mean())
    return x[mask]
data.groupby('MMSI').apply(obtain)

示例

我的源DataFrame:

        MMSI  CRS     CRC  EucDistPoint
0  210161100  1.0  1.0000           0.0
1  210161100  0.0  0.0281         200.0
2  210161100  0.0  0.0530         589.1
3  210161200  1.0  1.0000           0.0
4  210161200  0.0  0.0281         500.0
5  210161200  0.0  0.0530         200.1

均值(data.groupby('MMSI').mean()):

                CRS       CRC  EucDistPoint
MMSI                                       
210161100  0.333333  0.360367    263.033333
210161200  0.333333  0.360367    233.366667

特定列(df.groupby('MMSI').transform(lambda x: x >= x.mean()))的条件:

             CRS    CRC  EucDistPoint
MMSI                                 
210161100   True   True         False
210161100  False  False         False
210161100  False  False          True
210161200   True   True         False
210161200  False  False          True
210161200  False  False         False

如您所见,第1行和第5行的所有3列(行)均为 False 数字从0开始),因此它们不应出现在输出中。

以及您或我的函数的结果:

                  MMSI  CRS     CRC  EucDistPoint
MMSI                                             
210161100 0  210161100  1.0  1.0000           0.0
          2  210161100  0.0  0.0530         589.1
210161200 3  210161200  1.0  1.0000           0.0
          4  210161200  0.0  0.0281         500.0

应有尽有。