python - 基于对合并数据帧

标签 python pandas dataframe numpy

我有一个如下所示的数据框:

df = pd.DataFrame({'col_1': ['1', '2', '3', '4'],
                   'col_2': ['a:b,c:d', ':v', 'w:,x:y', 'a:g,h:b,j:']
                   })

col_2的数据类型是字符串,因此我们必须进行字符串操作/正则表达式。

我还有另一个数据帧,它具有 col_2 中键值对之间的映射。它看起来像这样:

df1 = pd.DataFrame({'col_1': ['a', 'c', '', 'w', 'x', 'a', 'h', 'j','t'],
                    'col_2': ['b', 'd', 'v', '','y', 'g', 'b', '', 'g'],
                    'col_3': ['aw', 'rt', 'er', 'aa', 'ey', 'wk', 'oo', 'ri', 'ty'],
                    'col_4': ['rt', 'yu', 'gq', 'tr', 'ui', 'pi', 'pw', 'pp', 'uu']
                   })

基本上,a:b 转换为 aw:rt,这意味着您无法访问 awrt > 没有 ab

我想从 col_4 中获取与 col_2 中的键值对相对应的所有值,所以我希望我的输出为

pd.DataFrame({'col_1': ['1', '2', '3', '4'],
                   'col_2': ['a:b,c:d', ':v', 'w:,x:y', 'a:g,h:b,j:'],
                   'col_3': ['rt,yu', 'gq', 'tr,ui','pi,pw,pp' ]
                   })

我能够使用提取键、值对作为不同的列

df[['c1', 'c2']] = df['col_2'].str.extract(r'^([^:,]*):([^:,]*)')

所以我可以将所有键值对提取为列,然后进行合并,但看起来路线很长,还有其他优化方法吗?

最佳答案

我会在这里使用基本的 pandas 方法。拆分并分解 col_2 以获取各个对,创建从对到 col_4 的映射,然后将其映射以替换值。

pairs = df['col_2'].str.split(',').explode()
mapping = df1['col_4'].set_axis(df1['col_1'] + ':' + df1['col_2'])
df['col_3'] = pairs.map(mapping).groupby(level=0).agg(','.join)

res

关于python - 基于对合并数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75549463/

相关文章:

python - 在 concat 之后,值更改为 float,而不是保留在 int 中(尝试在 concat 之前将其转换。)

python - 将 csv 文件中的日期字段读取到数据框中

dataframe - Julia - 搜索缺少所有列的行并删除这些行的函数

python - 在导入的多处理处理器子类上使用 .start() 时出现 IOerror

Pythons TexSoup 不解析文档

Python 无法使用 surrogateescape 进行编码

python - 如何在 Windows 10 中激活 python anaconda 并从常规命令提示符运行脚本

python - 生成PCA加载矩阵时如何将pandas dataframe列设置为索引

python - 查找 Pandas 中最长列的长度

python - Python 中 Dataframe 中每一行之间的余弦相似度