2015-10-09 66 views
3

假設我有以下數據幀:從熊貓數據幀中刪除重複與條件,用於保持原始

A | B 
1 | Ms 
1 | PhD 
2 | Ms 
2 | Bs 

欲相對於塔A中刪除重複的行,和我想與值保留行「博士」 B列作爲原始,如果我沒有找到一個‘博士’,我想保留行‘B列布’

我想使用

df.drop_duplicates('A') 

與一個cond銀行足球比賽

+0

如果你能以B字母順序排序,那麼你可以使用df.drop_duplicates(「A」,take_last = TRUE)但是你有時會得到女士而不是Bs。 – jgloves

+0

是的,我考慮過這個想法。但它不起作用 –

+0

你願意不使用drop_duplicates嗎? – jgloves

回答

3
>>> df 
    A B 
0 1 Ms 
1 1 Ms 
2 1 Ms 
3 1 Ms 
4 1 PhD 
5 2 Ms 
6 2 Ms 
7 2 Bs 
8 2 PhD 

排序一個數據幀使用自定義功能:

def sort_df(df, column_idx, key): 
    '''Takes a dataframe, a column index and a custom function for sorting, 
    returns a dataframe sorted by that column using that function''' 

    col = df.ix[:,column_idx] 
    df = df.ix[[i[1] for i in sorted(zip(col,range(len(col))), key=key)]] 
    return df 

我們的功能進行分類:

cmp = lambda x:2 if 'PhD' in x else 1 if 'Bs' in x else 0

在行動:

sort_df(df,'B',cmp).drop_duplicates('A', take_last=True)

A B 
4 1 PhD 
8 2 PhD 
4

假設B值的唯一性給出的值,以及各A值與BS A列B列:

df2 = df[df['B']=="PhD"] 

會給你你想要的博士學位行的數據幀。

然後從DF刪除所有博士和女士:

df = df[df['B']=="Bs"] 

然後拼接DF和DF2:

df3 = concat([df2, df]) 

然後你可以使用drop_duplicates像你想:

df3.drop_duplicates('A', inplace=True) 
2

考慮使用Categoricals。他們是一個很好的是組/命令文本非字母(除其他事項外)。

import pandas as pd 
df = pd.DataFrame([(1,'Ms'), (1, 'PhD'), (2, 'Ms'), (2, 'Bs'), (3, 'PhD'), (3, 'Bs'), (4, 'Ms'), (4, 'PhD'), (4, 'Bs')], columns=['A', 'B']) 
df['B']=df['B'].astype('category') 
# after setting the column's type to 'category', you can set the order 
df['B']=df['B'].cat.set_categories(['PhD', 'Bs', 'Ms'], ordered=True) 
df.sort(['A', 'B'], inplace=True) 
df_unique = df.drop_duplicates('A')