数据样本:
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)]
但这会删除几乎所有行,而不是其中所有值都相同的行
困难的是,还有其他列不会受到影响
答案 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)
根据我与乔的讨论。
我们有一个DataFrame,它有四列,并且最初的三列值都是int,而第四列有字符串值。
现在,我们在这里寻找是否要删除col1 col2 col3
列中包含100
的该行。
现在,如果我们看一下数据帧结构,那么在这种情况下,很容易捕捉并获得所需的结果,因为我们看到col4
在值中有一个a
第一行,所以我们可以从那里开始。但是,如果我们所有的行值都是100
但最后一个值不是a
且具有较大的DataFame,则在此处捕获它,则此方法不足以获取结果。
>>> 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:
>>> 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(可能在某个轴上)。