删除3个值为A的数据框行

时间:2019-09-02 16:12:32

标签: pandas dataframe

数据样本:

id   col1 col2 col3 col4
1    100   100   100    a
2    200   100   100    b
3    100   300   100    c

应成为:

id   col1 col2 col3 col4
2    200   100   100    b
3    100   300   100    c

尝试使用

df = df[(df['col1'] != 100) & (df['col2'] != 100)]

但这会删除几乎所有行,而不是其中所有值都相同的行

困难的是,还有其他列不会受到影响

3 个答案:

答案 0 :(得分:2)

我们可以做nunique

df[df[['col1','col2','col3']].nunique(1)>1]

然后

~df[['col1','col2','col3']].eq(100).all(axis=1)

答案 1 :(得分:1)

您可以使用:

def vizData(df, asg):
    df['Time of Last Submission'] = pd.to_datetime(df['Time of Last Submission'], errors='coerce')
    mask = ( df['Time of Last Submission'] > '2018-01-01 00:00:00') & (df['Time of Last Submission'] <= '2018-12-31 00:00:00')
    df = df.loc[mask]
    df['Num Lines Last Attempt'] = df['Num Lines Last Attempt'].apply(pd.to_numeric)

    fig, ax = plt.subplots()
    ax.scatter(df['Time of Last Submission'], df['Num Lines Last Attempt'])

    x_min = df['Time of Last Submission'].min() - datetime.timedelta(days=1)
    x_max = df['Time of Last Submission'].max() + datetime.timedelta(days=1)
    y_min = df['Num Lines Last Attempt'].min() - 5
    y_max = df['Num Lines Last Attempt'].max() + 15

    plt.xlim(x_min,x_max)
    plt.ylim(y_min,y_max)
    plt.xlabel('Time of Submission', fontsize=20)
    plt.ylabel('Number of Lines Changed for Last Submission', fontsize=15)
    plt.tick_params(labelsize=18)
    plt.rcParams['figure.figsize'] = [20, 10]
    plt.grid()
    plt.suptitle(asg, fontsize=30)
    plt.title('Time and Number of Lines Changed for the Last Submission', fontsize=25)
    labels = df['Student']
    datacursor(formatter='{label}'.format)
    plt.show()
  

输出:

  df=df[~df[['a','b','c']].eq('A').all(axis=1)]

print(df)

答案 2 :(得分:1)

根据我与乔的讨论。

  1. 我们有一个DataFrame,它有四列,并且最初的三列值都是int,而第四列有字符串值。

  2. 现在,我们在这里寻找是否要删除col1 col2 col3列中包含100的该行。

  3. 现在,如果我们看一下数据帧结构,那么在这种情况下,很容易捕捉并获得所需的结果,因为我们看到col4在值中有一个a第一行,所以我们可以从那里开始。但是,如果我们所有的行值都是100但最后一个值不是a且具有较大的DataFame,则在此处捕获它,则此方法不足以获取结果。

DataFrame示例:

>>> df
   col1  col2  col3 col4
0   100   100   100    a
1   200   100   100    b
2   100   300   100    c

什么是解决方案:

解决方案1:

>>> df[df.col4 != 'a']
   col1  col2  col3 col4
1   200   100   100    b
2   100   300   100    c

解决方案2:

>>> df.loc[lambda df: df.col4 != 'a']
   col1  col2  col3 col4
1   200   100   100    b
2   100   300   100    c

但是正如我上面提到的,只有在我们知道col4中具有值a的情况下,它才起作用,因此我们需要采取另一种战术方法来处理此问题,我们看到了@WeNYoBen答案之一

不过,我将在此处说明实现此目的的其他方法。

我们将使用索引方法.ix是最通用的索引器,并将支持.loc.iloc中的任何输入。 .ix还支持浮点标签方案。 .ix在处理混合的基于位置和基于标签的层次结构索引时非常有用。

解决方案3:

>>> df.ix[(df['col1'] != 100) | (df['col2'] != 100) | (df['col3'] != 100)]
   col1  col2  col3 col4
1   200   100   100    b
2   100   300   100    c

解决方案4:

我们将使用query()方法,该方法还支持Python的in和not比较运算符的特殊用法,为调用Series或DataFrame的isin方法提供了简洁的语法。

>>> df.query('col1 != col2 and col3 != col4')
# df.query('col1 != col2 & col3 != col4')

   col1  col2  col3 col4
1   200   100   100    b
2   100   300   100    c

@他还有另一个问题,我们可以删除该列每一行中所有值为100的列吗?

解决方案:

是的,我们可以做一个例子,与上一个类似的dataFrame带有额外的行,可以移置用于删除具有相同值的行的删除行,当dtype在原始DataFrame中是同质的时,我们得到一个具有相同dtype的转置DataFrame:

DataFrame示例:

>>> df
  col1 col2 col3 col4
0  100  100  100    a
1  200  100  100    b
2  100  300  100    c
3  100  100  100  100
4  100  100  100  100

正如我们在上面的DataFrame中看到的,最后两行具有相同的值,我们可以将其删除。

让我们看一下DataFrame的转置效果,我们看到下面所有行变成了列,而列变成了Index,现在它清楚地显示了转置后的DataFrame上的后两列3 & 4具有相同的值,我们可以删除/删除/删除或遮罩。

>>> df.T
        0    1    2    3    4
col1  100  200  100  100  100
col2  100  100  300  100  100
col3  100  100  100  100  100
col4    a    b    c  100  100

现在尝试..

>>> df[(df.T != 100).any()]
  col1 col2 col3 col4
0  100  100  100    a
1  200  100  100    b
2  100  300  100    c

我们使用DataFrame.any()作为其返回任何元素是否为True(可能在某个轴上)。