2017-08-12 16 views
3

私の最初の列に基づいて重複を削除したい場合は、これを 'id'とみなしてください。私が削除する必要がある値は、完全なデータが最も少ないレコードです。例えばパンダとPythonを使用して重複を削除してください

私はenter image description here

下のスクリーンショットに示す4つのレコードを持っていると私は私の列IDに基づいて重複を削除したいです。ただし、私が削除したい複製は、他の列の値に依存します。たとえば、lnameは数字ではありません。それはNAでも空白でもない。したがって、この例では、中央の行を保持し、他のすべての重複を削除したいと考えています。

他のフィールドのクリーナー値に基づいて、最もクリーンに見えるレコードを保持することによって、重複を除去するスマートフィルターを実装する方法を教えてください。

私はPythonでパンダライブラリを探していました。いずれの方向にも感謝します。あなたはgrouped.applyを使用することができ

data = pd.read_csv('x.csv'); 
data = (data.drop_duplicates(['id'], keep ='last')); 
+1

を参照してください。また、正確な基準は何ですか?また、期待される成果は何ですか?あなたは中央の行を保持したいと書いていますが、スクリーンショットに6行あります。あなたの制約をより具体的にし、[MCVE](https://stackoverflow.com/help/mcve)を投稿すると、応答時間が短縮されます。 –

答えて

0

、ドキュメントを使用すると、そのグループがかかりますが、その関数内のグループは、実際のDataFrameとして扱われます適用する機能を通過するには、「flexiableが適用されます」と呼んでいます。したがって、不要な行をフィルタリングし、その関数から単一のDataFrameを返します。 Pandasはこれらの呼び出しからのすべてのデータフレーム結果をインテリジェントに結合します。あなたはずっとあなたの代わりにスクリーンショットの実際の例のデータをポストあれば援助を取得する可能性が高くなりますドキュメントhttp://pandas.pydata.org/pandas-docs/stable/groupby.html

例::

def select(g): 
    g = g.ix[g.IName.isnull(), :] 
    return g 

df = df.groupby('id').apply(select) 
0
# Filter your data to only keep strings/unicodes in the 'Iname' column. 
data = data.loc[[isinstance(row, (str, unicode)) for row in data['Iname']], :] 

# Replace empty strings with NaN values. 
data.replace("", np.nan, inplace=True) 

# Drop nulls, remove duplicates and keep last. 
data = data[data['Iname'].notnull()].drop_duplicates(subset='id', keep='last') 
関連する問題