我有一个如下所示的数据框:
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'
答案 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