[英]If one dataframe value exists in another dataframe, then get a value from the dataframe
[英]Delete from DataFrame if value exists
我有一個看起來像這樣的數據框:
import pandas as pd
df = pd.DataFrame(data=[[1, 'ABC'], [2, 'ABC'], [3, 'ABCDEF'], [1, 'ABCDEF']], columns=['id', 'marker'])
我實際上是在熊貓中嘗試執行此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”
這是獲得所需內容的一種解決方案。 我稍稍更改了數據框,添加了[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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.