基于某些列中的空值删除行(Pandas)

2024-05-15 01:57:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道如何从包含所有空值或单个空值的数据帧中删除行,但能否基于指定列集的空值删除行?

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

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


Tags: 数据文档功能citypandas地理信息空值指导
3条回答

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

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

试试这个:

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...

您可以使用pd.dropna,但不使用how='all'subset=[],您可以使用thresh参数在删除行之前要求行中的NAs最少数量。在城市中,long/lat示例中,thresh=2将起作用,因为我们只在3个NAs的情况下下降。使用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

相关问题 更多 >

    热门问题