Python 比较具有不同列名的两个数据帧并查找匹配项
我有两个数据帧: df1: df2:Python 比较具有不同列名的两个数据帧并查找匹配项,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧: df1: df2: df2将始终有一行。如何检查df1中df2的该行是否匹配?使用Numpy比较与参数axis=1对行进行比较: df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['ss', 'sv', 'sc'], 'C': [123, 234, 333]}) df2 = pd.DataFrame({'A': [1], 'dd': ['ss'], 'xc': [123]}) df3 = df1.loc[np.all(df1.values =
df2将始终有一行。如何检查df1中df2的该行是否匹配?使用Numpy比较与参数axis=1对行进行比较:
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['ss', 'sv', 'sc'], 'C': [123, 234, 333]})
df2 = pd.DataFrame({'A': [1], 'dd': ['ss'], 'xc': [123]})
df3 = df1.loc[np.all(df1.values == df2.values, axis=1),:]
或:
对行使用与参数轴=1的Numpy比较:
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['ss', 'sv', 'sc'], 'C': [123, 234, 333]})
df2 = pd.DataFrame({'A': [1], 'dd': ['ss'], 'xc': [123]})
df3 = df1.loc[np.all(df1.values == df2.values, axis=1),:]
或:
除了Sandeep的回答之外,您还可以:
df1[np.all(df1.values == df2.values,1)].any().any()
用于获取布尔值
或者另一种方式:
df1[(df2.values==df1.values).all(1)].any().any()
或:
注意:两个输出均True
检查特定列(与Sandeep相同):
除了Sandeep的回答之外,您还可以:
df1[np.all(df1.values == df2.values,1)].any().any()
用于获取布尔值
或者另一种方式:
df1[(df2.values==df1.values).all(1)].any().any()
或:
注意:两个输出均True
检查特定列(与Sandeep相同):
如何检查df1中该行df2是否匹配
您可以对齐列,然后检查df1
与df2
中唯一一行的相等性:
df2.columns = df1.columns
res = (df1 == df2.iloc[0]).all(1).any() # True
此解决方案的好处是,您不需要子集df1
(昂贵),而是构建一个布尔数据帧/数组(便宜),并检查至少一行中的所有值是否为True
这仍然不是特别有效,因为您正在考虑df1
中的每一行,而不是在满足条件时停止。特别是对于数字数据,有更有效的解决方案
如何检查df1中该行df2是否匹配
您可以对齐列,然后检查df1
与df2
中唯一一行的相等性:
df2.columns = df1.columns
res = (df1 == df2.iloc[0]).all(1).any() # True
此解决方案的好处是,您不需要子集df1
(昂贵),而是构建一个布尔数据帧/数组(便宜),并检查至少一行中的所有值是否为True
这仍然不是特别有效,因为您正在考虑
df1
中的每一行,而不是在满足条件时停止。特别是对于数字数据,有更有效的解决方案。如果我只需要检查df2和df1中的特定列,该怎么办?像只检查df2中的dd、xc和df1的B、C一样?ValueError:数据帧的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
@qwww能否粘贴出现错误的代码段。另外,请检查语句是否完全相同。不要使用isin,因为它与索引名匹配,请尝试在第二个数据帧中更改索引名,但失败…@jezrael是的,谢谢您的建议。如果我只需要检查df2和df1中的特定列,该怎么办?像只检查df2中的dd、xc和df1的B、C一样?ValueError:数据帧的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
@qwww能否粘贴出现错误的代码段。另外,检查语句是否完全相同。不要使用isin,因为它与索引名匹配,尝试在第二个数据帧中更改索引名,但失败了…@jezrael是的,谢谢你的建议。如果列号不相同怎么办?@qwww,那么你有一个新问题:)。说真的,我假设你的问题中有df1
和df2
。无法自动对齐列。熊猫怎么知道xc
映射到C
?如果列号不一样怎么办?@qwww,那么你有一个新问题:)。说真的,我假设你的问题中有df1
和df2
。无法自动对齐列。熊猫如何知道xc
映射到C
?
df1[col].isin(df2[col]).any()
df2.columns = df1.columns
res = (df1 == df2.iloc[0]).all(1).any() # True