2017-08-11 111 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

謝謝,但是這不工作,當有更多的列,我已經給了一個例子很抱歉,如果我的問題一開始並不清楚 – user113531

+0

先生你對冗餘數據的想法有點難以理解。你可以添加你想要的預期輸出。 – Dark