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

问题描述 投票:0回答:6

假设您有一些学生

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

python pandas dataframe series
6个回答
4
投票

考虑以下方法:

# 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
投票

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


1
投票

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

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

结果:

    Name    Age City
1   Riti    39  Delhi

1
投票

检查

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

0
投票

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

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

否则,你可以这样做

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

0
投票

单行:

 row_exists = (s == dfObj).all(axis=1).any()
© www.soinside.com 2019 - 2024. All rights reserved.