假设您有一些学生
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,因为它在列选择(如果需要)方面最灵活。
答案 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 ")
答案 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)]