如果所有值都等于1,请在熊猫中放入一列?

时间:2019-10-30 13:10:12

标签: python-3.x pandas

如何在熊猫的各列中的所有值均等于特定数字的列中删除列?例如,考虑以下数据框:

df = pd.DataFrame({'A': [1, 1, 1, 1],
                   'B': [0, 1, 2, 3],
                   'C': [1, 1, 1, 1]})
print(df)

输出:

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

如何删除1列,使输出为:

   B
0  0
1  1
2  2
3  3

3 个答案:

答案 0 :(得分:2)

使用DataFrame.loc来测试DataFrame.neDataFrame.any的至少一个非1值:

df1 = df.loc[:, df.ne(1).any()]

或者用DataFrame.eqDataFrame.all测试1的每列真值,用~测试倒置掩码:

df1 = df.loc[:, ~df.eq(1).all()]

print (df1)
   B
0  0
1  1
2  2
3  3

编辑:

  

一个考虑因素是,如果您的列只有Nan和1,那么您想怎么做?

然后用DataFrame.fillnaNaN替换为0,并使用与以前相同的解决方案:

df1 = df.loc[:, df.fillna(0).ne(1).any()]

df1 = df.loc[:, ~df.fillna(0).eq(1).all()]

答案 1 :(得分:2)

您可以使用any

df.loc[:, df.ne(1).any()]

答案 2 :(得分:2)

一个考虑因素是,如果您的列只有Nan和1,那么您想怎么做?

如果您也想在这种情况下掉线,则可以用1填充或添加或添加新条件。

df = pd.DataFrame({'A': [1, 1, 1, 1],
                   'B': [0, 1, 2, 3],
                   'C': [1, 1, 1, np.nan]})
print(df)

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

所有这些使NaN和1离开该列。

df.loc[:, df.ne(1).any()]
df.loc[:, ~df.eq(1).all()]

因此,您可以添加此添加内容以也删除该列。

df.loc[:, ~(df.eq(1) | df.isna()).all()]

输出:

   B
0  0
1  1
2  2
3  3