根据某些列(pandas)中的空值删除行

时间:2017-02-08 22:49:10

标签: python pandas

我知道如何从包含所有空值或单个null的DataFrame中删除一行但是可以根据指定的一组列的空值删除一行吗?

例如,假设我正在处理包含地理信息(城市,纬度和经度)的数据以及许多其他字段。我想保留至少包含城市值的行或者lat和long的行,但是删除所有三个都具有空值的行。

我在pandas文档中找不到此功能。任何指导都将不胜感激。

5 个答案:

答案 0 :(得分:3)

您可以使用pd.dropna但不是使用how='all'subset=[],而是可以使用thresh参数在一行前要求最少数量的NA掉线了。在城市,long / lat示例中,thresh=2将起作用,因为我们只在3个NA的情况下丢弃。使用MaxU设置的大数据示例,我们可以

## get the data
df = pd.read_clipboard()

## remove undesired rows
df.dropna(axis=0, subset=[['city', 'longitude', 'latitude']], thresh=2) 

这会产生:

In [5]: df.dropna(axis=0, subset=[['city', 'longitude', 'latitude']], thresh=2)
Out[5]:
  city  latitude  longitude  a  b
0  aaa   11.1111        NaN  1  2
1  bbb       NaN    22.2222  5  6
3  NaN   11.1111    33.3330  1  2

答案 1 :(得分:2)

试试这个:

In [25]: df
Out[25]:
  city  latitude  longitude  a  b
0  aaa   11.1111        NaN  1  2
1  bbb       NaN    22.2222  5  6
2  NaN       NaN        NaN  3  4
3  NaN   11.1111    33.3330  1  2
4  NaN       NaN    44.4440  1  1

In [26]: df.query("city == city or (latitude == latitude and longitude == longitude)")
Out[26]:
  city  latitude  longitude  a  b
0  aaa   11.1111        NaN  1  2
1  bbb       NaN    22.2222  5  6
3  NaN   11.1111    33.3330  1  2

如果我正确理解OP,则必须删除索引为4的行,因为两个坐标都不为空。因此dropna()在这种情况下无法正常工作:

In [62]: df.dropna(subset=['city','latitude','longitude'], how='all')
Out[62]:
  city  latitude  longitude  a  b
0  aaa   11.1111        NaN  1  2
1  bbb       NaN    22.2222  5  6
3  NaN   11.1111    33.3330  1  2
4  NaN       NaN    44.4440  1  1   # this row should be dropped...

答案 2 :(得分:2)

dropna有一个参数可以仅对列的子集应用测试:

dropna(axis=0, how='all', subset=[your three columns in this list])

答案 3 :(得分:1)

使用布尔掩码和一些聪明的dot产品(这适用于@Boud)

subset = ['city', 'latitude', 'longitude']
df[df[subset].notnull().dot([2, 1, 1]).ge(2)]

  city  latitude  longitude  a  b
0  aaa   11.1111        NaN  1  2
1  bbb       NaN    22.2222  5  6
3  NaN   11.1111    33.3330  1  2

答案 4 :(得分:0)

您可以通过利用按位运算符来执行选择。

## create example data
df = pd.DataFrame({'City': ['Gothenburg', None, None], 'Long': [None, 1, 1], 'Lat': [1, None, 1]})

## bitwise/logical operators
~df.City.isnull() | (~df.Lat.isnull() & ~df.Long.isnull())
0     True
1    False
2     True
dtype: bool

## subset using above statement
df[~df.City.isnull() | (~df.Lat.isnull() & ~df.Long.isnull())]
         City  Lat  Long
0  Gothenburg  1.0   NaN
2        None  1.0   1.0