考虑一个由各种列组成的数据框,但是我想通过比较两列的值来过滤该数据框。下面是数据框的示例。
Machine Position
M01 PB0
M02 PB0
M03 PB0
M04 PB0
M01 PB1
M02 PB1
M01 PB1
M01 PB1
在上面您可以看到所有机器的位置均为PB0,但是只有两台机器同时具有PB0和PB1,现在我希望列出一列同时具有PB0和PB1的机器
machine=['M01','M02']
要考虑的一件事是,在这两列中可能有很多重复项。
答案 0 :(得分:2)
让我们定义您的数据框:
import pandas as pd
df = pd.DataFrame({'Machine': {0: 'M01',
1: 'M02',
2: 'M03',
3: 'M04',
4: 'M01',
5: 'M02',
6: 'M01',
7: 'M01'},
'Position': {0: 'PB0',
1: 'PB0',
2: 'PB0',
3: 'PB0',
4: 'PB1',
5: 'PB1',
6: 'PB1',
7: 'PB1'}})
要获得每台机器的位置,无论重复的位置如何,我们可以使用:
s = df.groupby('Machine')['Position'].apply(set)
看起来像这样:
Machine
M01 {PB1, PB0}
M02 {PB1, PB0}
M03 {PB0}
M04 {PB0}
Name: Position, dtype: object
要获取仅包含PB0
和PB1
位置的机器,我们可以使用
s[s.apply(lambda x: x.issuperset({'PB1','PB0'}))].index
返回
Index(['M01', 'M02'], dtype='object', name='Machine')
(如果您更喜欢列表而不是pd.Index,也可以在末尾添加.to_list()
)
答案 1 :(得分:1)
您可以
new_df = df.groupby("machine").count().reset_index()
m = new_df[new_df["Position"]==2]["machine"].tolist()
print(m)