"source"と"target"の値が重複している行を削除したいです.
python
1import pandas as pd 2 3df = pd.DataFrame( 4 { "id":[0,1,2,3,4,5], 5 "name":["A","B","C","D","E","F"], 6 "source": [0,0,1,0,3,2], 7 "target": [1,2,1,2,5,0], 8 } 9) 10print(df) 11""" 12 id name source target 130 0 A 0 1 141 1 B 0 2 152 2 C 1 1 163 3 D 0 2 174 4 E 3 5 185 5 F 2 0 19""" 20# 上のデータフレームを次のようにしたい 21""" 22 id name source target 230 0 A 0 1 241 1 B 0 2 252 2 C 1 1 263 4 E 3 5 27"""
やってみたこと
python
1df = df.drop_duplicates(subset=['source','target']) 2print(df) 3""" 4 id name source target 50 0 A 0 1 61 1 B 0 2 72 2 C 1 1 84 4 E 3 5 95 5 F 2 0 10"""
この方法だと"name" ="F" の行が残ってしまいます.
単純な重複の削除ではなく,source=0,target=2とsource=2,target=0も同じものと判断したいです.
解決方法(これよりもっといい方法が知りたい)
データフレームをリストに変換し,集合を用いて"source"と"target"の重複を取り除き,
再びリストをデータフレームに再変換することでやりたいことが実現できました.
python
1df = pd.DataFrame( 2 { "id":[0,1,2,3,4,5], 3 "name":["A","B","C","D","E","F"], 4 "source": [0,0,1,0,3,2], 5 "target": [1,2,1,2,5,0], 6 } 7) 8 9 10l = [] 11new_df = [] 12for _,(name_id,name,source,target) in df.iterrows(): 13 if not {source,target} in l: 14 l.append({source,target}) 15 new_df.append([name_id,name,source,target]) 16 17df = pd.DataFrame(new_df,columns=['id', 'name', 'source', 'target']) 18print(df) 19""" 20 id name source target 210 0 A 0 1 221 1 B 0 2 232 2 C 1 1 243 4 E 3 5 25"""
わざわざデータフレームをリストに変換することなくできる方法があれば教えていただけますか.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。