【问题标题】:Drop rows with NaNs based on other column values根据其他列值删除具有 NaN 的行
【发布时间】:2017-09-19 19:18:03
【问题描述】:

删除所有带有任何空值的行都没有问题,但我只想删除带有空值的某些行并保留其他行

例如:

index  city      lo        hi
 0    Chicago    nan      75
 1    Boston     nan      nan
 2    New York   54       89
 3    Miami      nan      nan
 4    Seattle    49       nan

请记住,我的行数不止 5 行。所以,df.dropna(axis=0, how='any') 只会给我留下2 New York 54 89

但如果我只想放弃芝加哥和迈阿密怎么办?我将如何在“城市”列上设置该条件?所以我最终会得到:

index   city     lo        hi
 1    Boston     nan      nan
 2    New York   54       89
 4    Seattle    49       nan

【问题讨论】:

  • 这毫无意义。波士顿也有nan in lo``,你为什么不放弃呢?您真的想指定要退出的城市列表吗?或者您只想使用lo 或仅使用hi
  • Seattle 的值也从输入变为输出。
  • 伙计们,这只是一个例子。我想删除带有任何空值的特定行,因为我不需要填充这些值。我只想留下稍后会填充的空值。只是清除我知道我不需要的行。所以是的,我想删除任何具有空值的行,由另一列中的条件指定。因此,在示例中,我不希望删除所有带有 null 的行。我也不希望所有没有 null 的 'Chicago' 或 'Miami' 都被丢弃。因此,按城市值删除将与城市一起删除所有内容(不希望那样)删除带有空值的行将删除所有这些行(也不希望那样)

标签: python pandas dataframe nan


【解决方案1】:

使用isin 查找特定城市的所有行,然后沿第一个轴使用isnull 并从原始数据框中删除这些行中包含空值的所有行。

cities = ['Miami', 'Boston']
idx = df[df.city.isin(['Boston', 'Miami'])].isnull().any(1).index    
df = df.loc[df.index.difference(idx)]

print(df)
   index      city    lo    hi
0      0   Chicago   NaN  75.0
2      2  New York  54.0  89.0
4      4   Seattle  49.0   NaN

index.difference 将返回df.index 中所有不在idx 中的索引值。

【讨论】:

  • 但这会删除所有“迈阿密”行,这是我不想要的。我怎么做这个条件?所以删除具有指定城市的行以及该行中的任何空值...仅删除“迈阿密”行?因此保留任何没有空值的“迈阿密”行
  • @chitown88 终于得到你想要的了。请参阅我的编辑。下次,请使用更能代表您想要的示例。