Pandas使用标准删除重复项

时间:2016-05-23 19:23:11

标签: python pandas

说我有以下数据框:

//right
<button type="button" ng-click="emitEvent()" class="btn btn-info img-center">{{name}}</button>

//right controller
$scope.emitEvent = function(){
  $scope.$emit('changeAnimal');
}

//left controller
$scope.$on('changeAnimal', function(event){
  //do stuff
})

我想删除&#34; Var1&#34;中存在重复的案例,但我想确保保留的副本是&#39; Var1&#39; ==&# 39; VAR2&#39;

我的输出数据框是:

>>> import pandas as pd
>>> 
>>> d=pd.DataFrame()
>>> 
>>> d['Var1']=['A','A','B','B','C','C','D','E','F']
>>> d['Var2']=['A','Z','B','Y','X','C','Q','N','P']
>>> d['Value']=[34, 45, 23, 54, 65, 77,100,102,44]
>>> d
  Var1 Var2  Value
0    A    A     34
1    A    Z     45
2    B    B     23
3    B    Y     54
4    C    X     65
5    C    C     77
6    D    Q    100
7    E    N    102
8    F    P     44
>>> 

有关如何做到这一点的任何建议?使用groupby过滤器是最好的方法吗?

2 个答案:

答案 0 :(得分:2)

这是一个单行:

>>> d.loc[~d.Var1[(d.Var1 == d.Var2).argsort()].duplicated('last')]

  Var1 Var2  Value
0    A    A     34
2    B    B     23
5    C    C     77
6    D    Q    100
7    E    N    102
8    F    P     44

如果您希望(Var1)准确获取您发布的输出,则可以在d.set_index('Var1')上设置索引。

要打破它:

  • d.Var1[(d.Var1 == d.Var2).argsort()]是一系列Var1中的值,其排列方式是Var1 == Var2在最后的行

  • ~d.Var1[(d.Var1 == d.Var2).argsort()].duplicated('last')适用于Var1不重复的行;如果有重复,我们选择最后一个(因此Var1 == Var2具有优先权)

答案 1 :(得分:0)

我的建议是将Var 2和Value作为字典创建。

    d['Var1']=['A','A','B','B','C','C','D','E','F']
    d['Var2']=['A','Z','B','Y','X','C','Q','N','P']
    d['Var2Val'] = {'A':34,'Z':45,'B':23,'Y':54,'X':65,'C':77,'Q':100,'N':102,'P':44}

然后我会为Var1创建一个没有重复项的列表,如果它们在Var2中则打印出来

    for x in d['Var1']:
        if d['Var1'][x] in d['Var2']:

然后打印表

至少这是最简单的方法,即使它可能有点长