有没有办法从不同的数据集中找出另一列中列值的每次出现?

Is there a way to find out each occurrence of a column value in another column from a different dataset?

我有两个数据集:dataset1 和 dataset2(提供图像 link),它们有一个名为 SAX 的公共列,它是一个字符串对象。

dataset1=
         SAX
0    glngsyu
1    zicobgm
2    eerptow
3    cqbsynt
4    zvmqben
..       ...
475  rfikekw
476  bnbzvqx
477  rsuhgax
478  ckhloio
479  lbzujtw

480 rows × 2 columns

dataset2 =
    SAX     timestamp
0   hssrlcu 16015
1   ktyuymp 16016
2   xncqmfr 16017
3   aanlmna 16018
4   urvahvo 16019
... ... ...
263455  jeivqzo 279470
263456  bzasxgw 279471
263457  jspqnqv 279472
263458  sxwfchj 279473
263459  gxqnhfr 279474

263460 rows × 2 columns

只要 dataset1SAX 列中的值存在于 dataset2SAX 列中,我就需要查找并打印出时间戳。 是否有 function/method 来实现上述目标?

谢谢。

让我们创建一个任意数据集来展示它是如何工作的:

import pandas as pd
import numpy as np

def sax_generator(num):
    return [''.join(chr(x) for x in np.random.randint(97, 97+26, size=4)) for _ in range(num)]

df1 = pd.DataFrame(sax_generator(10), columns=['sax'])
df2 = pd.DataFrame({'sax': sax_generator(10), 'timestamp': range(10)})

让我们来看看数据:

df1 = 
|    | sax   |
|---:|:------|
|  0 | cvtj  |
|  1 | fmjy  |
|  2 | rjpi  |
|  3 | gwtv  |
|  4 | qhov  |
|  5 | uriu  |
|  6 | kpku  |
|  7 | xkop  |
|  8 | kzoe  |
|  9 | nydj  |

df2 =
|    | sax   |   timestamp |
|---:|:------|------------:|
|  0 | kzoe  |           0 |
|  1 | npyo  |           1 |
|  2 | uriu  |           2 |
|  3 | hodu  |           3 |
|  4 | rdko  |           4 |
|  5 | pspn  |           5 |
|  6 | qnut  |           6 |
|  7 | gtyz  |           7 |
|  8 | gfzs  |           8 |
|  9 | gcel  |           9 |

现在确保我们在 df1 中的 df2 中有一些匹配值,我们稍后可以检查这些值:

df2['sax'][2] = df1['sax'][5]
df2['sax'][0] = df1['sax'][8]

然后使用:

df2.loc[df1.sax.apply(lambda x: df2.sax.str.contains(x)).any(), 'timestamp']

获得:

|    |   timestamp |
|---:|------------:|
|  0 |           0 |
|  2 |           2 |

使用 np.where docs here 您也可以取回索引:

np.where(df1.sax.apply(lambda x: df2.sax.str.contains(x)) == True)
# -> (array([5, 8]), array([2, 0]))

在这里我们可以看到 df1 有匹配的索引 [5, 8] 并且 df2[2, 0],这正是我们用上面的行强制执行的... 如果我们看一下 df1.sax.apply(lambda x: df2.sax.str.contains(x)) 的 return,上面的结果与索引完全匹配 (magic...whooo):

|    |   0 |   1 |   2 |   3 |   4 |   5 |   6 |   7 |   8 |   9 |
|---:|----:|----:|----:|----:|----:|----:|----:|----:|----:|----:|
|  0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  2 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  3 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  4 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  5 |   0 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  6 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  7 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  8 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
|  9 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |

第 1 步:使用以下方法将数据集 2 转换为字典: 将 numpy 导入为 np 将 pandas 导入为 pd

a_dictionary = df.to_dict['list]

第 2 步:在 for 循环中使用比较器来提取时间戳。

lookup_value = "abcdef" #This can be a list item.

all_keys = []
for key, value in a_dictionary.items():
    if(value == lookup_value):
         all_keys.append(key)

print(all_keys)

第 3 步:尽情享受吧!