【发布时间】:2021-03-16 23:15:54
【问题描述】:
我想根据列子集的组合删除所有具有 NaN 值的行。让我们用一个简单的例子来演示一下:
df = pd.DataFrame(
[[1, np.nan, 3, 4], [1, 2, 3, 4], [np.nan, np.nan, 3, 4], [1, np.nan, np.nan, 4], [1, 2, np.nan, np.nan]],
columns=["a1", "a2", "b1", "b2"],
)
print(df)
# a1 a2 b1 b2
# 0 1.0 NaN 3.0 4.0
# 1 1.0 2.0 3.0 4.0
# 2 NaN NaN 3.0 4.0
# 3 1.0 NaN NaN 4.0
# 4 1.0 2.0 NaN NaN
我想删除 {a1, a2} 或 {b1, b2} 集合中的 all 特征为 NaN 的行。所以输出将是(删除第 2 行和第 4 行):
a1 a2 b1 b2
0 1.0 NaN 3.0 4.0
1 1.0 2.0 3.0 4.0
3 1.0 NaN NaN 4.0
理想情况下,我需要df.dropna(how="all", subset=["a1", "a2"]) 和df.dropna(how="all", subset=["b1", "b2"]) 的某种组合。在这种简单的情况下,它不会是这样的问题,但是如果有例如10 个不同的子集? (在我的真实场景中,它几乎是 50。)
是否有任何使用 pandas 或任何过滤器的智能解决方案如何组合这些子集并为dropna 方法创建正确的条件?
动机:只是为了让您了解我为什么需要这样的东西,因为我有不同的功能集(a、b、...)组合在一个 DataFrame 中,我需要分别处理这些功能。一些 NaN 是可以的,但如果任何特征的任何行都充满了 NaN,这意味着测量错误,我也想为任何其他特征删除这一行(想象一下索引是测量时间,如果一组features 不正确我不想保留它,即使其他功能集都很好)。
【问题讨论】:
-
如果您有一个可以生成列子集的生成器函数,那么您可以使用它在循环中指定您的 dropna 子集。除此之外,我不立即知道这样做的方法
-
@Nerxis 子集可以是列的任意组合,例如
{'a1', 'b2'}或{'c1', 'd2'}? -
是的,它可能是。在我的情况下,它通常是
{"temp_sensor_1", "temp_sensor_2", "temp_ambient", ...}和其他像{"volt_p_phase_a", "volt_s_phase_a", "volt_main_lv_phase_a", ...}等等。但通常它可能是任何组合,它取决于传感器组,因此即使是不同类型的测量也可以在一个组中。