【问题标题】:How to select the result of a match from a dataframe in Pandas?如何从 Pandas 的数据框中选择匹配结果?
【发布时间】:2020-08-26 17:36:36
【问题描述】:

我尝试使用 pandas 在数据框中选择行,但不知何故我找不到与我的案例类似的示例。解决方案应该很简单,但我有点卡住了。

  1. 有两个数据框kg_df
    source   edge     target
0   Jack     bought   apple     

mylist:

    Unnamed            URL                        Length     Match Text
0   0           http://example.com/Alice             5        Alice
1   1           http://example.com/Finn              4        Finn
2   2           http://example.com/Jack              4        Jack

以上数据只是一个例子(一种情况)。每次生成新数据时,dataframes中的数据都不一样。

  1. 我想从mylist 中选择一行,使用kg_df 中的值(即Jack 在两个数据帧中匹配),但我想做不同的操作,如果两个数据帧之间只有匹配,因为有时没有匹配项(以上情况有匹配项,因为Jack 出现在两个数据帧中)。
obj = kg_df['source'].values[0]
objhit = mylist[mylist['Match Text'] == obj]
if len(objhit) == 1:
    objURI = objhit ['URL']
    object1 = URIref(objURI[2])

所以我检查了len == 1,但我无法获得object1。上面的代码之所以有效,是因为我指定了行号 (objURI[2])。但是,我当然不知道 objhit 的结果是找到 [1] 还是 [99]。如何在不知道行号的情况下正确获取 object1?

非常感谢!

【问题讨论】:

  • 请添加更多说明!
  • 我认为您正在检查列表是否相等,而不是检查它们是否具有共同元素
  • 对不起,@Anurag Dhadse,如果您不理解我的问题。但我也不知道你不明白什么......所以我无法更好地解释它,除非你指定哪个部分是不可理解的。下面的 Vasil Yordanov 很困惑,但至少给了我一个答案。
  • @Phineas。感谢您的评论,但两者有区别吗?解决我的问题应该是什么意思?有什么建议可以重构我的代码吗?干杯
  • 当两个列表相等时,它们的所有元素都相同。我知道你只需要找到共同的元素,而不是如果列表相等

标签: python pandas dataframe


【解决方案1】:

我很困惑...你为什么不先加入两个表以找到共同的元素,然后根据需要应用掩码?

pd.merge(df1, df2, left_on='source', right_on='Match Text', how='inner')

【讨论】:

  • 很抱歉造成混淆。但没问题。这很好用。没想过合并。非常感谢。如果有其他好的方法可以解决我的问题,我可能会稍等。
【解决方案2】:

这可以通过使用 dataframe.merge 来实现,如果在两个数据帧中都找到结果,它将显示 _merge 结果。

comparison_df = df.merge(df1, indicator=True, how='outer', left_on='source', right_on='Match Text')
print(comparison_df[(comparison_df['_merge']=='both')].URL)

此代码将为您提供 datafram2 中的 URL 字段。

输出: 0http://example.com/Jack

【讨论】:

  • 谢谢。这行得通。它类似于@Vasil Yordanov,它首先出现。
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2020-10-18
相关资源
最近更新 更多