Python Dataframe有条件地drop_duplicates

时间:2015-10-20 14:49:39

标签: python pandas dataframe

我想根据列的值类型删除数据帧的重复行。例如,我的数据框是:

A    B
3    4
3    4
3    5
yes  8
no   8
yes  8

如果df['A']是一个数字,我想drop_duplicates()

如果df['A']是一个字符串,我想保留重复项。

所以期望的结果是:

A    B
3    4
3    5
yes  8
no   8
yes  8

除了使用for循环外,是否有Pythonic方法可以做到这一点?谢谢!

2 个答案:

答案 0 :(得分:3)

创建新列C:如果A列为数字,请在C中指定公共值,否则在C中指定唯一值。

之后,正常drop_duplicates

注意:有一个很好的isnumeric()方法可以测试一个单元格是否类似数字。

In [47]:

df['C'] = np.where(df.A.str.isnumeric(), 1, df.index)
print df
     A  B  C
0    3  4  1
1    3  4  1
2    3  5  1
3  yes  8  3
4   no  8  4
5  yes  8  5
In [48]:

print df.drop_duplicates()[['A', 'B']] #reset index if needed
     A  B
0    3  4
2    3  5
3  yes  8
4   no  8
5  yes  8

答案 1 :(得分:1)

此解决方案更详细,但对于更多涉及的测试可能更灵活:

def true_if_number(x):
    try:
        int(x)
        return True
    except ValueError:
        return False

rows_numeric = df['A'].apply(true_if_number)

df['A'][rows_numeric].drop_duplicates().append(df['A'][~rows_numeric])