2017-08-11 10 views
1

各グループ(この場合はデータソース)内のデータベース内の冗長な行を削除したいと考えています。グループ内の冗長エントリを削除する

たとえば、次の表のとおりです。行1は、同じグループ内の他の行の行0と同じ情報が含まれていますが、より多くのデータが含まれているため、冗長です。

同じ理由から、行6は冗長です。グループ内の他のすべての行3,4,5には、それ以上の情報が含まれています。しかし、彼らはグループの他の行とはいくつかの追加の異なる情報を持っているので、私は行4と5の両方を保持します。

datasource   city country 
0   1 Shallotte  US 
1   1   None  US 
2   2  austin  US 
3   3 Casselberry  US 
4   3   None  AU 
5   3 Springfield None 
6   3   None None 

さらに多くの列、行0と1、4がある場合の例は、異なる情報です。しかし、行2と3(または行1)には冗長な情報が含まれています。

datasource   city country Count 
0   1  None  US  11 
1   1  austin None None 
2   1  None  None  11 
3   1  austin None None 
4   1  None  CA None 

の予想される出力

datasource   city country Count 
0   1  None  US  11 
1   1  austin None None 
4   1  None  CA None 

私は任意の数の列のためのパンダまたはSQL(PostrgeSQL)で、このようなロジックを実現することができ、簡単な方法はありますか?

答えて

1

がここで使用して別のアプローチだ役に立てば幸いBharath shettyの解決策と同じ基本戦略。このやり方はちょっとわかりやすく感じます。

まず、例えば、データフレームを構築物:

import pandas as pd 
data = {"datasource": [1,1,2,3,3,3,3], 
     "city": ["Shallotte", None, "austin", "Casselberry", None, "Springfield", None], 
     "country": ["US", "US", "US", "US", "AU", None, None]} 
df = pd.DataFrame(data) 

df['null'] = df.isnull().sum(axis=1) 

print(df) 
      city country datasource null 
0 Shallotte  US   1  0 
1   None  US   1  1 
2  austin  US   2  0 
3 Casselberry  US   3  0 
4   None  AU   3  1 
5 Springfield None   3  1 
6   None None   3  2 

groupbyapplyを使用してブールマスクを作る - 私たちはグループごとに最大のヌル値をドロップ:

def null_filter(d): 
    if len(d) > 1: 
     return d.null < d.null.max() 
    return d.null == d.null 

mask = df.groupby("datasource").apply(null_filter).values 

df.loc(mask).drop("null", 1) 

出力:

   city country datasource 
0 Shallotte  US   1 
2  austin  US   2 
3 Casselberry  US   3 
4   None  AU   3 
5 Springfield None   3 
1

方法の一つは、なしカウントに基づいており、最大なしの削除行はすなわち

#Count the None values across the row 
df['Null'] = (df.values == 'None').sum(axis=1) 

#Get the maximum of the count based on groupby 
df['Max'] = df.groupby('datasource')['Null'].transform(max) 

# Get the values are not equal to max and equal to zero and drop the columns 
df = df[~((df['Max'] !=0) & (df['Max'] == df['Null']))].drop(['Null','Max'],axis=1) 

出力値:

 
    datasource   city country 
0   1 Shallotte  US 
2   2  austin  US 
3   3 Casselberry  US 
4   3   None  AU 
5   3 Springfield None 

はそれが

+0

しかし、これ以上の列がある場合はこれは機能しません、私はexaを与えました私の質問が最初にはっきりしない場合は申し訳ありません – user113531

+0

あなたの冗長データのアイデアは少し分かりません。必要な出力を追加できますか? – Dark

関連する問題