假设您有一些学生
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 个答案后更新:这些都是很好的答案 - 谢谢!我还没有在不同方法之间进行任何速度测试。我个人选择这个解决方案,因为它在列选择方面最灵活(如果需要)。
考虑以下方法:
# 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())
一种方法是将 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 ")
使用 apply/lambda 并检查每列(axis=1)是否等于 s。
dfObj[dfObj.apply(lambda x: x.equals(s), axis=1)]
结果:
Name Age City
1 Riti 39 Delhi
检查
dfObj.apply(tuple,1).isin([tuple(s.tolist())])
如果您不关心原始数据框中的索引,这会起作用
df.merge(s.to_frame().T, how="inner")
否则,你可以这样做
df[np.all(df.values == s.reindex(df.columns).values, axis=1)]
单行:
row_exists = (s == dfObj).all(axis=1).any()