2017-05-03 81 views
4

有了這個數據幀:刪除重複的數據框保持行,其最低空值

d = {'A' : pd.Series(['AA', 'AA', 'AA', 'BB','CC'], 
      index=['a', 'b', 'c', 'd','e']), 
    'B' : pd.Series([1., 2., 3.], index=['b', 'd','e']), 
    'C' : pd.Series([4., 5., 6.], index=['b', 'd', '']), 
    'D' : pd.Series([1., 2., 3.,4.], index=['a', 'c', 'd','e'])} 

In[1]: pd.DataFrame(d) 

Out[1]: 
    A B C D 
a AA NaN NaN 1.0 
b AA 1.0 4.0 NaN 
c AA NaN NaN 2.0 
d BB 2.0 5.0 3.0 
e CC 3.0 6.0 4.0 

我想砸df['A']重複和保留該行與列在未被最少的空值下降了on

In[2]: pd.DataFrame(d).drop_duplicates(on='A', **magical_answer=True**) 

Out[1]: 
    A B C D 
b AA 1.0 4.0 NaN 
d BB 2.0 5.0 3.0 
e CC 3.0 6.0 4.0 

我可以看到,如果有與空最少多個行會出現在本例中沒有列舉了可能的問題,在這種情況下,這將是非常有用的的keep : {‘first’, ‘last’} ARG。

回答

4

如果你沒有複製的指數,你可以這樣做:

df.loc[df.notnull().sum(1).groupby(df.A).idxmax()] 

# A B C D 
#b AA 1.0 4.0 NaN 
#d BB 2.0 5.0 3.0 
#e CC 3.0 6.0 4.0 
+0

這是光滑的。默認情況下,如果存在具有相同數量的空值的多行,則它會保留第一條記錄。關於如何保持最後記錄的想法? –

+0

您可以反轉這兩個系列,因爲'idxmax()'總是獲得第一個最大索引。 'df.loc [df.count(1)[:: - 1] .groupby(df.A [:: - 1])。idxmax()]'。 – Psidom

1

讓我們嘗試採取的優點是count不算數楠:

df_out = df.groupby('A', as_index=False).apply(lambda x: x[(x.count(axis=1)==x.count(axis=1).max())]) 

OR

df_out = df.groupby('A', as_index=False).apply(lambda x: x.loc[x.count(axis=1).idxmax()]) 
print(df_out) 

輸出:

 A B C D 
0 b AA 1.0 4.0 NaN 
1 d BB 2.0 5.0 3.0 
2 e CC 3.0 6.0 4.0 
3

另一種方法是計算每行中的項目數,對DataFrame進行排序並保留最後一項,使其具有最高的計數。

(df.assign(counts=df.count(axis=1)) 
    .sort_values(['A', 'counts']) 
    .drop_duplicates('A', keep='last') 
    .drop('counts', axis=1)) 
Out: 
    A B C D 
b AA 1.0 4.0 NaN 
d BB 2.0 5.0 3.0 
e CC 3.0 6.0 4.0