Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两列筛选数据帧_Python_Pandas_Filter - Fatal编程技术网

Python 比较两列筛选数据帧

Python 比较两列筛选数据帧,python,pandas,filter,Python,Pandas,Filter,考虑一个由不同列组成的数据帧,但我希望通过比较两列的值来过滤数据帧。下面是dataframe的示例 Machine Position M01 PB0 M02 PB0 M03 PB0 M04 PB0 M01 PB1 M02 PB1 M01 PB1 M01 PB1 上面你可以看到所有的机器都有位置PB0,但是只有两台机器同时有PB0和P

考虑一个由不同列组成的数据帧,但我希望通过比较两列的值来过滤数据帧。下面是dataframe的示例

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']

需要考虑的是这两个列中可能有很多重复。

让我们定义您的数据文件:

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.索引,还可以在末尾添加一个

您可以这样做

new_df = df.groupby("machine").count().reset_index()
m = new_df[new_df["Position"]==2]["machine"].tolist()
print(m)

您在下面写的是一个预期的数据帧,但没有,只有示例。