首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用列组合查找行熊猫中的数据不匹配

使用列组合查找行熊猫中的数据不匹配
EN

Stack Overflow用户
提问于 2018-11-20 21:42:19
回答 3查看 2.5K关注 0票数 1

基于列值组合获得所有单元格值的最佳方法是什么?

样本数据一:

代码语言:javascript
代码运行次数:0
运行
复制
  Stock                         Name  Price
0    AMD       Advanced Micro Devices    100
1     GE     General Electric Company    200
2    BAC  Bank of America Corporation    300
3   AAPL                   Apple Inc.    500
4   MSFT        Microsoft Corporation   1000
5  GOOGL                Alphabet Inc.   2000

样本数据二:

代码语言:javascript
代码运行次数:0
运行
复制
  Stock                         Name  Price
0    AMD       Advanced Micro Devices    100
1     GE     General Electric Company    200
2    BAC  Branch of America Corporation  300
3   AAPL                   Apple Inc.    500
4   MSFT        Microsoft Corporation   1000
5  GOOGL                Alphabet Inc.   2000

例如:我想使用(Stock和Name)作为键列,然后比较数据集。目的是将两个数据集之间的不匹配项与用作组合键的Stock+Name列打印出来。

我正在使用Pandas/Python3.7 3.7

样本输出:

美国银行300 .美国银行300分行

EN

回答 3

Stack Overflow用户

发布于 2018-11-20 21:45:43

也许,使用merge + query实现完整的内部连接

代码语言:javascript
代码运行次数:0
运行
复制
df1.merge(df2, on='Stock').query('Name_x != Name_y')

  Stock                       Name_x  Price_x                         Name_y  Price_y
2   BAC  Bank of America Corporation      300  Branch of America Corporation      300

或者,一个与map稍有不同的解决方案,您可以使用它获取股票符号:

代码语言:javascript
代码运行次数:0
运行
复制
m = df1.Stock.map(df2.set_index('Stock').Name).ne(df1.Name)
symbols = df1.loc[m, 'Stock']

print(symbols)
2    BAC
Name: Stock, dtype: object

然后按股票代码访问每个DataFrame行:

代码语言:javascript
代码运行次数:0
运行
复制
df1[df1.Stock.isin(symbols)]
  Stock                         Name  Price
2   BAC  Bank of America Corporation    300

df2[df2.Stock.isin(symbols)]
  Stock                           Name  Price
2   BAC  Branch of America Corporation    300
票数 2
EN

Stack Overflow用户

发布于 2018-11-20 21:52:33

如果它们位于两个数据流中,那么不附加条件地将它们合并到.concat中是非常简单的。一旦它们被加入,这里有一种方法可以得到不匹配:

代码语言:javascript
代码运行次数:0
运行
复制
import pandas as pd

df1 = pd.DataFrame({
    "Ticker_y": list("qwerty"),
    "Name_y": list("asdfgh"),
    "Ticker_x": list("qw3r7y"),
    "Name_x": list("as6f8h")
})

mismatch = df1[(df1["Ticker_y"] != df1["Ticker_x"]) & (df1["Name_y"] != df1["Name_x"])]

最后一行只是说“df只满足这些条件”。

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 04:23:54

我们可以使用isin使用值序列进行测试,因为它确保DataFrame中的每个元素都包含在值中。

First DataFrame

代码语言:javascript
代码运行次数:0
运行
复制
>>> df1
   Stock                         Name  Price
0    AMD       Advanced Micro Devices    100
1     GE     General Electric Company    200
2    BAC  Bank of America Corporation    300
3   APPL                   Apple Inc.    500
4   MSFT        Microsoft Corporation   1000
5  GOOGL                Alphabet Inc.   2000

第二DataFrame

代码语言:javascript
代码运行次数:0
运行
复制
>>> df2
   Stock                           Name  Price
0    AMD         Advanced Micro Devices    100
1     GE       General Electric Company    200
2    BAC  Branch of America Corporation    300
3   APPL                     Apple Inc.    500
4   MSFT          Microsoft Corporation   1000
5  GOOGL                  Alphabet Inc.   2000

你可以走了。

代码语言:javascript
代码运行次数:0
运行
复制
>>> df2[~df2.Name.isin(df1.Name.values)]
  Stock                           Name  Price
2   BAC  Branch of America Corporation    300

代码语言:javascript
代码运行次数:0
运行
复制
>>> df1[~df1.Name.isin(df2.Name.values)]
  Stock                         Name  Price
2   BAC  Bank of America Corporation    300
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53402012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档