从Pandas dataFrame中删除重复项,并保留原始条件

Rak*_*van 4 python dataframe pandas

假设我有以下DataFrame:

 A | B
 1 | Ms
 1 | PhD
 2 | Ms
 2 | Bs
Run Code Online (Sandbox Code Playgroud)

我想删除关于A列的重复行,并且我想保留B列中值为'PhD'的行作为原始行,如果我没有找到'PhD',我想保留行B栏中的"B".

我正在尝试使用

 df.drop_duplicates('A') 
Run Code Online (Sandbox Code Playgroud)

有条件的

hel*_*err 8

>>> 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
Run Code Online (Sandbox Code Playgroud)

使用自定义函数对数据框进行排序:

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
Run Code Online (Sandbox Code Playgroud)

我们的排序功能:

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
Run Code Online (Sandbox Code Playgroud)


mat*_*ier 8

考虑使用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')
Run Code Online (Sandbox Code Playgroud)


小智 5

假设给定一个A值,B值的唯一性,并且每个A值在B列中都有一行带有Bs的行:

df2 = df[df['B']=="PhD"]
Run Code Online (Sandbox Code Playgroud)

将为您提供一个包含所需博士学位行的数据框。

然后从df中删除所有博士和硕士:

df = df[df['B']=="Bs"]
Run Code Online (Sandbox Code Playgroud)

然后连接df和df2:

df3 = concat([df2, df])
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要使用drop_duplicates:

df3.drop_duplicates('A', inplace=True)
Run Code Online (Sandbox Code Playgroud)