如果值存在,则从DataFrame中删除

时间:2016-01-18 23:54:17

标签: python pandas

我有一个如下所示的数据框:

import pandas as pd
df = pd.DataFrame(data=[[1, 'ABC'], [2, 'ABC'], [3, 'ABCDEF'], [1, 'ABCDEF']], columns=['id', 'marker'])

我有效地尝试在Pandas中执行此SQL语句。

delete #table
from #table a, #table b
where a.id = b.id
and a.marker = b.marker + 'DEF'

哪个会有效地摆脱数据帧中的最后一行。知道我怎么能这样做吗?

编辑:

为了澄清上述内容,我们可以说数据是这样的:

   id  marker
0   1     ABC
1   2     ABC
2   3  ABCDEF
3   1  ABCDEF
4   4  ABCDEF

答案应该是

   id  marker
0   1     ABC
1   2     ABC
2   3  ABCDEF
4   4  ABCDEF

(1,' ABCDEF')被省略,因为(1,' ABC')存在,这是SQL语句有效地做的事情(即,删除ID所有的行)是平等的,标记有'DEF'附加)。如果对于ID X,只有' ABCDEF'目前它会保留它,但如果ID Y同时具有' ABC'和' ABCDEF'它会删除' ABCDEF'

1 个答案:

答案 0 :(得分:0)

这是一个可以满足您需求的解决方案。我稍微更改了数据框,添加了[2, 'ABCDEF']以证明此代码将保持ABC,无论ABCDEF还是ABC首先出现。

df = pd.DataFrame(data=[[1, 'ABCDEF'], [2, 'ABC'], [2, 'ABCDEF'], [3, 'ABCDEF'], [1, 'ABC']], columns=['id', 'marker'])
df
id  marker
0   1   ABCDEF
1   2   ABC
2   2   ABCDEF
3   3   ABCDEF
4   1   ABC

lst = df.values.tolist()
list_tuples = [tuple(l) for l in lst]
newdata = {}
for key,value in list_tuples:
    newdata.setdefault(key, []).append(value)
newdata = {k:sorted(v) if len(v) > 1 else v for k,v in newdata.items()}
create_dataframe = {k:v[0] for k,v in newdata.items()}

df2 = pd.DataFrame(list(create_dataframe.items()), columns=['id', 'marker'])
df2.index = range(len(df2))
df2

id  marker
0   1   ABC
1   2   ABC
2   3   ABCDEF