Pandas检查一个dataframe中的字符串列是否包含来自另一个datafram的一对字符串

2024-04-27 19:01:38 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是基于我问的另一个问题,我没有完全涵盖这个问题:Pandas - check if a string column contains a pair of strings

这是问题的修改版本。在

我有两个数据帧:

df1 = pd.DataFrame({'consumption':['squirrel ate apple', 'monkey likes apple', 
                                  'monkey banana gets', 'badger gets banana', 'giraffe eats grass', 'badger apple loves', 'elephant is huge', 'elephant eats banana tree', 'squirrel digs in grass']})

df2 = pd.DataFrame({'food':['apple', 'apple', 'banana', 'banana'], 
                   'creature':['squirrel', 'badger', 'monkey', 'elephant']})

目标是测试食品食品:df.生物df1.consumptions中存在对。在

在上述示例中,此测试的预期答案为:

^{pr2}$

模式是:

松鼠吃了苹果=真的,因为松鼠和苹果是一对。 monkey likes apple=错误,因为monkey和apple不是我们要找的一对。在

我在考虑构建一个包含成对值的数据帧字典,其中每个数据帧对应于一种生物,例如松鼠、猴子等,然后使用np.哪里创建布尔表达式并执行结构包含. 在

不知道这是否是最简单的方法。在


Tags: 数据appledataframemonkeypdbananadf1likes
2条回答

这是我用理解和zip
注意,这将检查df1中的子字符串

c = df1.consumption.values.tolist()
f = df2.food.values.tolist()
a = df2.creature.values.tolist() 

check = np.array([[fd in cs and cr in cs for fd, cr in zip(f, a)] for cs in c])

check.any(1)

array([ True, False,  True, False, False,  True, False,  True, False], dtype=bool)

这是@MaxU所做事情的pandas版本。尊重他所做的。。。太棒了!在

^{pr2}$

原始测试

enter image description here

考虑这种矢量化方法:

from sklearn.feature_extraction.text import CountVectorizer

vect = CountVectorizer()

X = vect.fit_transform(df1.consumption)
Y = vect.transform(df2.creature + ' ' + df2.food)

res = np.ravel(np.any((X.dot(Y.T) > 1).todense(), axis=1))

结果:

^{pr2}$

说明:

In [68]: pd.DataFrame(X.toarray(), columns=vect.get_feature_names())
Out[68]:
   apple  ate  badger  banana  digs  eats  elephant  gets  giraffe  grass  huge  in  is  likes  loves  monkey  squirrel  tree
0      1    1       0       0     0     0         0     0        0      0     0   0   0      0      0       0         1     0
1      1    0       0       0     0     0         0     0        0      0     0   0   0      1      0       1         0     0
2      0    0       0       1     0     0         0     1        0      0     0   0   0      0      0       1         0     0
3      0    0       1       1     0     0         0     1        0      0     0   0   0      0      0       0         0     0
4      0    0       0       0     0     1         0     0        1      1     0   0   0      0      0       0         0     0
5      1    0       1       0     0     0         0     0        0      0     0   0   0      0      1       0         0     0
6      0    0       0       0     0     0         1     0        0      0     1   0   1      0      0       0         0     0
7      0    0       0       1     0     1         1     0        0      0     0   0   0      0      0       0         0     1
8      0    0       0       0     1     0         0     0        0      1     0   1   0      0      0       0         1     0

In [69]: pd.DataFrame(Y.toarray(), columns=vect.get_feature_names())
Out[69]:
   apple  ate  badger  banana  digs  eats  elephant  gets  giraffe  grass  huge  in  is  likes  loves  monkey  squirrel  tree
0      1    0       0       0     0     0         0     0        0      0     0   0   0      0      0       0         1     0
1      1    0       1       0     0     0         0     0        0      0     0   0   0      0      0       0         0     0
2      0    0       0       1     0     0         0     0        0      0     0   0   0      0      0       1         0     0
3      0    0       0       1     0     0         1     0        0      0     0   0   0      0      0       0         0     0

更新:

In [92]: df1['match'] = np.ravel(np.any((X.dot(Y.T) > 1).todense(), axis=1))

In [93]: df1
Out[93]:
                 consumption  match
0         squirrel ate apple   True
1         monkey likes apple  False
2         monkey banana gets   True
3         badger gets banana  False
4         giraffe eats grass  False
5         badger apple loves   True
6           elephant is huge  False
7  elephant eats banana tree   True
8     squirrel digs in grass  False
9        squirrel.eats/apple   True   # <  - NOTE

相关问题 更多 >