检查数据框中是否已存在系列

时间:2019-06-10 13:21:59

标签: python pandas dataframe series

假设您有一些学生

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,因为它在列选择(如果需要)方面最灵活。

5 个答案:

答案 0 :(得分:3)

请考虑以下方法:

# 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())

答案 1 :(得分:1)

一种方法是将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 ")

enter image description here

答案 2 :(得分:1)

检查

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

答案 3 :(得分:1)

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

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

结果:

    Name    Age City
1   Riti    39  Delhi

答案 4 :(得分:0)

如果您不在乎原始数据框中的索引,则可以使用

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

否则,您可以

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