【问题标题】:Filtering a pandas dataframe comparing two columns过滤比较两列的熊猫数据框
【发布时间】:2020-06-08 23:31:50
【问题描述】:

考虑一个由各种列组成的数据框,但我想通过比较两列的值来过滤数据框。下面是数据框的示例。

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'] 需要考虑的一件事是在这两列中可能有很多重复项。

【问题讨论】:

  • 您在下面写的是预期的数据框,但没有,只有示例。

标签: python pandas filter


【解决方案1】:

让我们定义你的数据框:

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

要只获取位置同时包含PB0PB1 的机器,我们可以使用

s[s.apply(lambda x: x.issuperset({'PB1','PB0'}))].index

返回

Index(['M01', 'M02'], dtype='object', name='Machine')

(如果您更喜欢列表而不是 pd.Index,也可以在末尾添加 .to_list()

【讨论】:

    【解决方案2】:

    你可以的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      相关资源
      最近更新 更多