python - 如果相应的 IDs pandas 中只存在值,则删除 NaNs

标签 python pandas

我有这个数据框

 Id,ProductId,Product
  1,100,a
  1,100,x
  1,100,NaN
  2,150,NaN
  3,150,NaN
  4,100,a
  4,100,x
  4,100,NaN

这里我想删除一些包含 NaN 的行和一些我不想删除的行。 删除标准如下。 我只想删除那些 NaNs 行,其 Id 已经包含 Product 列中的值。 例如,这里的 Id1 已经在 Product 列中有值并且仍然包含 NaN,所以我想删除该行。 但是对于 id2,Product 列中只存在 NaN。所以我不想删除那个。同样对于 Id3,Product 列中只有 NaN 值,我也想保留它。

最终输出是这样的

Id,ProductId,Product
1,100,a
1,100,x
2,150,NaN
3,150,NaN
4,100,a
4,100,x

最佳答案

如果存在替代方案,请不要使用 groupby,因为速度很慢。

vals = df.loc[df['Product'].notnull(), 'Id'].unique()
df = df[~(df['Id'].isin(vals) & df['Product'].isnull())]
print (df)
   Id  ProductId Product
0   1        100       a
1   1        100       x
3   2        150     NaN
4   3        150     NaN
5   4        100       a
6   4        100       x

解释:

首先获取所有具有非缺失值的Id:

print (df.loc[df['Product'].notnull(), 'Id'].unique())
[1 4]

然后用缺失值检查这些组:

print (df['Id'].isin(vals) & df['Product'].isnull())
0    False
1    False
2     True
3    False
4    False
5    False
6    False
7     True
dtype: bool

反转 bool 掩码:

print (~(df['Id'].isin(vals) & df['Product'].isnull()))
0     True
1     True
2    False
3     True
4     True
5     True
6     True
7    False
dtype: bool

最后按 boolean indexing 过滤:

print (df[~(df['Id'].isin(vals) & df['Product'].isnull())])
   Id  ProductId Product
0   1        100       a
1   1        100       x
3   2        150     NaN
4   3        150     NaN
5   4        100       a
6   4        100       x

关于python - 如果相应的 IDs pandas 中只存在值,则删除 NaNs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53281147/

相关文章:

python - 根据其他 2 列确定列值

Python/ Pandas : Eliminate for Loop using 2 DataFrames

python - 有条件地填写 Pandas 数据框

python - 使用 pip3 安装 mysqlclient 时遇到问题

python - 在 Python 中使用列表

python - 在 reST 中指定 anchor 名称

python - scikit学习0.18.1 : 'module' object has no attribute 'neural_network'

python - 如何使用正则表达式捕获 python 中两个连字符之间的单词?

python - 使用 pandas 将列值转换为行

python - 如何向两个方向延伸线段