首页 > 解决方案 > Pandas Dataframes - 从另一个数据帧的字符串列中的一个数据帧中搜索一个整数

问题描述

我有两个数据框:

DF1

                cid          dt        tm    id    distance
2      ed032f716995  2021-01-22  16:42:48    43   21.420561
3      16e2fd96f9ca  2021-01-23  23:19:43   539  198.359355
102    cf092e68fa82  2021-01-22  09:03:14     8   39.599627
104    833ccf05433b  2021-01-24  02:53:08    11   33.168314

DF2

        id            cluster  
0        3                      
1        6             7,8,43  
2       20               1817  
3       25   
4       10  11,13,14,15,9,539 

我想id在. df1_ 所需的输出是:clusterdf2

                cid          dt        tm    id    distance     cluster
2      ed032f716995  2021-01-22  16:42:48    43   21.420561     7,8,43
3      16e2fd96f9ca  2021-01-23  23:19:43   539  198.359355     11,13,14,15,9,539
102    cf092e68fa82  2021-01-22  09:03:14     8   39.599627     7,8,43 
104    833ccf05433b  2021-01-24  02:53:08    11   33.168314     11,13,14,15,9,539

在上面的 df1 - line 1 中,由于 df2 中存在 43,因此我将 df1 - line 1 的整个集群详细信息包括在内。

我尝试了以下方法:

for index, rows in df1.iterrows():
    for idx,rws in df2.iterrows():
        if (str(rows['id']) in str(rws['cluster'])):
            print([rows['id'],rws['cluster']])

这看起来像工作。但是,由于df2['cluster']是一个字符串,即使有部分匹配,它也会返回结果。例如,如果 df1['id'] = 34 和 df2['cluster'] 有 344,432 等,它仍然基于 344 匹配并返回肯定结果。

我在这里尝试了另一种选择:

d = {k: set(v.split(',')) for k, v in df2.set_index('id')['cluster'].items()}
df1['idc'] = [next(iter([k for k, v in d.items() if set(x).issubset(v)]), '') for x in str(df1['id'])]

但是,在上面我收到一个错误,表明两个数据集之间的变量长度不同。

如何根据 df1 中 id 列的完全匹配来映射集群?

标签: pythonpandasdataframe

解决方案


一种方法是拆分cluster, explodeit 和 map:

to_map = (df2.assign(cluster_i=df2.cluster.str.split(','))
    .explode('cluster_i').dropna()
    .set_index('cluster_i')['cluster']
)

df1['cluster'] = df1['id'].astype(str).map(to_map)

输出:

              cid          dt        tm   id    distance            cluster
2    ed032f716995  2021-01-22  16:42:48   43   21.420561             7,8,43
3    16e2fd96f9ca  2021-01-23  23:19:43  539  198.359355  11,13,14,15,9,539
102  cf092e68fa82  2021-01-22  09:03:14    8   39.599627             7,8,43
104  833ccf05433b  2021-01-24  02:53:08   11   33.168314  11,13,14,15,9,539

推荐阅读