【问题标题】:Check if a Series is already in a Dataframe检查一个系列是否已经在数据框中
【发布时间】:2019-06-10 13:21:59
【问题描述】:

假设你有一些学生

students = [ ['Jack', 34, 'Sydeny'] ,
             ['Riti', 30, 'Delhi' ] ,
             ['Aadi', 16, 'New York'] ]
dfObj = pd.DataFrame(students, columns = ['Name', 'Age', 'City'])

现在您会收到这样的系列:

s = pd.Series(['Riti', 30, 'Delhi'], index=['Name', 'Age', 'City'])

我现在可以使用.loc 来过滤如下条件:

filtered_dfObj = dfObj.loc[(dfObj['Name'] == s['Name']) & (dfObj['Age'] == s['Age'])]
filtered_dfObj = filtered_dfObj.loc[filtered_dfObj['City'] == s['City']]

但如果我有很多列,过滤器代码会增长得非常快。所以最好有s.isin(dfObj)这样的选项


5 个答案后更新:这些都是很好的答案 - 谢谢!我还没有在不同的方法之间进行任何速度测试。我个人选择this solution,因为它在列选择方面最灵活(如果需要的话)。

【问题讨论】:

  • 感谢您的快速回复@AlexandreB。不幸的是,这看起来并不乐观,因为我想检查该系列的内容是否存在于bObj 行中。重复列没有错误。
  • 我认为 df.equals(s) 可能有用.. ?

标签: python pandas dataframe series


【解决方案1】:

考虑以下方法:

# number of full duplicates (rows)
print((dfObj == s).all(axis=1).sum())

如果您只想检查某些列,则可以按列名称添加过滤器,例如:

flt = ['Name', 'Age']
# number of partial duplicates (rows)
print((dfObj[flt] == s[flt]).all(axis=1).sum())

【讨论】:

    【解决方案2】:

    一种方法是将 Dataframe 数据转换为列表并将系列数据转换为列表并进行比较。

    import pandas as pd
    
    students = [ ['Jack', 34, 'Sydeny'] ,
                 ['Riti', 30, 'Delhi' ] ,
                 ['Aadi', 16, 'New York'] ]
    dfObj = pd.DataFrame(students, index = ['Name', 'Age', 'City'])
    s = pd.Series(['Riti', 38, 'Delhi'], index=['Name', 'Age', 'City'])
    
    if(s.values.tolist() in dfObj.values.tolist()):
        print("Series present in  Datframe ")
    else:
        print("Series NOT present in  Datframe ")
    

    【讨论】:

    • 感谢您提示系列数据和 df 数据不匹配 - 复制/粘贴错误 - 有问题编辑
    • 这种方法适用于小型数据集 - 非常感谢!但是,如果您想避免类型转换,我会倾向于其他选择之一。
    【解决方案3】:

    使用 apply/lambda 并检查每列 (axis=1) 是否等于 s。

    dfObj[dfObj.apply(lambda x: x.equals(s), axis=1)]
    

    结果:

        Name    Age City
    1   Riti    39  Delhi
    

    【讨论】:

      【解决方案4】:

      检查

      dfObj.apply(tuple,1).isin([tuple(s.tolist())])
      

      【讨论】:

        【解决方案5】:

        如果您不关心原始数据框中的索引,这将起作用

        df.merge(s.to_frame().T, how="inner")
        

        否则,你可以这样做

        df[np.all(df.values == s.reindex(df.columns).values, axis=1)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-18
          • 1970-01-01
          • 2021-02-18
          • 2018-10-05
          • 2020-02-04
          • 2015-07-12
          • 1970-01-01
          相关资源
          最近更新 更多