【问题标题】:Remove duplicate column based on a condition in pandas根据熊猫中的条件删除重复的列
【发布时间】:2021-04-14 19:01:38
【问题描述】:

我有一个 DataFrame,其中有一个重复的列,即天气。 As Seen in this picture of dataframe。其中一个包含 NaN 值,这是我要从 DataFrame 中删除的值。 这个方法我试过了

data_cleaned4.drop('Weather', axis=1)

它应该删除两列。我试图将条件传递给 drop 方法,但我做不到。它显示了一个错误。

data_cleaned4.drop(data_cleaned4['Weather'].isnull().sum() > 0, axis=1)

谁能告诉我如何删除此列。请记住,倒数第二个包含 NaN 值而不是最后一个。

【问题讨论】:

  • 我试过pandas.read_image,但它只是以“没有属性”的形式返回。您能否将数据帧作为代码发布,直到那些懒鬼实现它?

标签: python pandas numpy data-science data-analysis


【解决方案1】:

由于名称重复,您可以稍微重命名,这就是下面代码的第一个留置权所做的,那么它应该可以工作......

data_cleaned4 = data_cleaned4.iloc[:, [j for j, c in enumerate(data_cleaned4.columns) if j != i]]

checkone = data_cleaned4.iloc[:,-1].isna().any()
checktwo = data_cleaned4.iloc[:,-2].isna().any()

if checkone:
    data_cleaned4.drop(data_cleaned4.columns[-1], axis=1)
elif checktwo:
    data_cleaned4.drop(data_cleaned4.columns[-2], axis=1)
else:
    data_cleaned4.drop(data_cleaned4.columns[-2], axis=1)

【讨论】:

    【解决方案2】:

    如果没有可测试的样本并假设您的数据框中的其他任何地方都没有 NaN

    df = df.dropna(axis=1)

    应该工作

    【讨论】:

      【解决方案3】:

      一个通用的解决方案。 (df.isnull().any(axis=0).values) 获取哪些列具有任何 NaN 值,df.columns.duplicated(keep=False) 将所有重复项标记为 True,两者结合将给出您要保留的列

      一般解决方案:

      df.loc[:, ~((df.isnull().any(axis=0).values) & df.columns.duplicated(keep=False))]
      

      输入

          A   B   C   C   A
      0   1   1   1   3.0 NaN
      1   1   1   1   2.0 1.0
      2   2   3   4   NaN 2.0
      3   1   1   1   4.0 1.0
      

      输出

          A   B   C
      0   1   1   1
      1   1   1   1
      2   2   3   4
      3   1   1   1
      

      仅用于列C:

      df.loc[:, ~(df.columns.duplicated(keep=False) & (df.isnull().any(axis=0).values)
                  & (df.columns == 'C'))]
      

      输入

          A   B   C   C   A
      0   1   1   1   3.0 NaN
      1   1   1   1   2.0 1.0
      2   2   3   4   NaN 2.0
      3   1   1   1   4.0 1.0
      

      输出

          A   B   C   A
      0   1   1   1   NaN
      1   1   1   1   1.0
      2   2   3   4   2.0
      3   1   1   1   1.0
      

      【讨论】:

      • 这个成功了。感谢您的解决方案。
      • 欢迎您! @Malik 因为它适用于您的问题,您可能会考虑接受,支持答案
      • 我已经对您的回答投了赞成票,但它显示声望低于 15 的人所投的票被计算在内,但未被添加为公开。请支持我的问题,这可能会增加我的声誉。
      • 完成。我想接受答案仍然有效
      猜你喜欢
      • 2019-04-19
      • 2017-10-04
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多