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

ges*_*gle 6 python pandas

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

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

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

Gen*_*sky 7

您可以使用pd.dropna但不是使用how='all'and subset=[],而是可以使用该thresh参数在一行被删除之前要求最少数量的 NA。在城市中,long/lat 示例中,athresh=2会起作用,因为我们只在 3 个 NA 的情况下下降。使用 MaxU 设置的优秀数据示例,我们会做

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

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

这产生:

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
Run Code Online (Sandbox Code Playgroud)


Max*_*axU 3

尝试这个:

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
Run Code Online (Sandbox Code Playgroud)

如果我正确理解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...
Run Code Online (Sandbox Code Playgroud)