根据条件熊猫删除行

时间:2020-10-02 18:59:20

标签: python pandas dataframe

考虑一下,我有一个看起来像这样的数据框:

   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

我需要做的是将C和D相加,如果总和大于10,则删除整行。但是,我无法按列名来访问列,我需要按它们的位置来访问。

我如何在大熊猫中做到这一点?

编辑: 另一个问题。

   A  B   C   D
0  0  NaN   2   3
1  4  5   NaN   NaN
2  8  9  10  11

如何在B,C和D列中保留至少具有两个值的行?

3 个答案:

答案 0 :(得分:1)

为什么不能按名称访问列?如果确实不能,则可以执行以下操作:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame({'A': [0, 4, 8], 'B': [1, 5, 9], 'C': [2, 6, 10], 'D': [3, 7, 11]})

In [3]: df
Out[3]:
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

In [4]: df.loc[df.iloc[:, 2:].sum(axis=1) <= 10]
Out[4]:
   A  B  C  D
0  0  1  2  3

答案 1 :(得分:1)

在B,C和D列中保留至少具有两个值的行。 您可以使用它。

df = pd.DataFrame({'A': [0,4,8], 'B':[1, np.nan, 9], 'C':[2,np.nan, np.nan], 'D':[3, 7, 11]})
mask = df.iloc[:,1:].isnull().sum(axis=1) < 2
print(df[mask])

输出

    A   B   C   D
0   0   1.0 2.0 3
2   8   9.0 NaN 11

对于第一个问题,您应该使用nan填写其余的df.fillna()值, Documentation,然后使用较早答案中提供的解决方案

df = new_df.fillna(0)
print(df)

输出

   A    B    C   D
0  0  1.0  2.0   3
2  8  9.0  0.0  11

现在,您可以使用df.loc[df.iloc[:, 2:].sum(axis=1) <= 10]删除CD之和大于10的行。

最后,我建议您每个问题保留1条帖子,这有助于其他人进行搜索。

答案 2 :(得分:0)

这是:

df[(df['C']+df['D']) <= 10]