让我们定义以下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)。
答案 0 :(得分:0)
通过比较device
,然后通过构造函数比较新的DataFrame,获得具有a
和i
值的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