【问题标题】:Filtering out rows that have a string field contained in one of the rows of another column of strings过滤出字符串字段包含在另一列字符串的行中的行
【发布时间】:2017-10-20 23:58:35
【问题描述】:

有两个 Pandas 数据集

csv1 = pandas.read_csv('test1')
csv2 = pandas.read_csv('test2')

如何显示csv1 的所有行,其中str1 字段不是csv2str2 字段的任何行的子字符串?

注意:我尝试使用contains,但它的参数pat 似乎应该是一个字符串,而不是一列字符串。


例子:

#csv1
id str1
1  abc
2  def
3  ghi
4  xyz

#csv2
data1 str2
69236 pghiww
9623  habcrv
6152  de

那么输出应该是:

id str1
2  def
4  xyz

确实,第 2 行和第 4 行的 str1 字段不包含在 csv2str2 的任何行中。

【问题讨论】:

  • 另一种方式更容易df2[~df2.str2.str.contains("|".join(df1.str1))]。这是一个有趣的问题!
  • @Basj,如果您需要澄清我的回答,请告诉我。

标签: python pandas csv


【解决方案1】:

这个问题的挑战在于不仅要检测是否存在匹配,还要找出什么匹配什么,并进行相应的过滤。在理解中使用str.contains 的一种选择:

csv1 = csv1.iloc[[~csv2.str2.str.contains(x).any() for x in csv1.str1]]
print(csv1)
   id str1
1   2  def
3   4  xyz

【讨论】:

  • 非常感谢@COLDSPEED!只是几件事,为什么.str.any()?另外,为什么是iloc 而不是loc
  • 另外,可以只显示匹配的人(只需删除代码中的~ 即可!)。那么我们如何添加一个匹配的列呢?例如:id str1 match / 1 abc habcrv / 3 ghi pghiww.
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多