熊猫:在一列中查找重复项,第二列中存在两个完全不同的值

时间:2018-11-08 10:16:32

标签: pandas duplicates

让我们定义以下DataFrame:

df = pd.DataFrame([["A", "i"], 
                   ["A", "i"], 
                   ["A", "a"], 
                   ["B", "i"], 
                   ["B", "i"],
                   ["C", "a"],
                   ["C", "a"],
                   ["D", "a"],
                   ["D", "i"]], columns=['device', 'status'])

我现在要查找的是一种设备,其中至少有一个状态为 a 和一个状态为 i 。然后,我想将所有 i 更改为 a ,并删除重复项。

我想第一步是显示有问题的行:

df = pd.DataFrame([["A", "i"], 
                   ["A", "i"], 
                   ["A", "a"], 
                   ["D", "a"],
                   ["D", "i"]], columns=['device', 'status'])

然后第二步应将 i 替换为 a

df = pd.DataFrame([["A", "a"], 
                   ["A", "a"], 
                   ["A", "a"], 
                   ["D", "a"],
                   ["D", "a"]], columns=['device', 'status'])

应删除重复项,所以我最终得到:

df = pd.DataFrame([["A", "a"], 
                   ["D", "a"]], columns=['device', 'status'])

背景是我有几台当前显示不同状态的设备。仅当所有情况都发生在i(不活动)上时,我才能将此设备的总体状态显示为不活动。否则,必须将其视为仍处于活动状态。

虽然我可以处理步骤2)和3),但我无法找到方法1)。

1 个答案:

答案 0 :(得分:0)

通过比较device,然后通过构造函数比较新的DataFrame,获得具有ai值的set值,

s = df.groupby('device')['status'].apply(set)
idx = s.index[s == set(['a','i'])]
print (idx)
Index(['A', 'D'], dtype='object', name='device')

df = pd.DataFrame({'device': idx, 'status':'a'})
print (df)
  device status
0      A      a
1      D      a

如果要执行所有步骤:

df = df[df['device'].isin(idx)].replace({'status':{'i':'a'}}).drop_duplicates()
print (df)
  device status
0      A      a
7      D      a