数据帧中的条件连接

2024-09-30 04:28:31 发布

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

我有三组代码(代码1、代码2和代码3)包含字母数字对象。所有代码都用分隔符(;)分隔,并且这些代码是基于顺序关联的,如代码1的A123与代码2的A和代码3的A445相关,依此类推。代码3有一些代码重复或重复

我想要的输出是得到连接的“代码4”,其中代码1和代码2基于这两个条件之一连接

a)如果代码3中的相应代码没有重复值

b)如果代码3中的对应代码具有重复值,则需要使用代码3中最后一个重复值位置对应的位置来连接代码1和代码2(类似于B678 R4,因为代码3中A445重复了两次,连接代码1和代码2需要考虑A445的第四个位置)

让我知道是否可以使用任何逻辑来获得输出。提前谢谢

dataframe df的Python脚本是

df11 = pd.DataFrame({"code1": ["A123; A321; B478; B678; C567", "A321; A821; B448; B698; C577"], "code2": ["A; B5; N5; R4; H5", "A3; B; N; R7; H2"],"code3": ["A445; A323; A323; A445; A659", "A328; A328; A621; A442; A621"]},      index=[0, 1], )

期望的输出和输入代码应该如下所示 enter image description here


Tags: 对象代码顺序字母数字条件分隔符r4
2条回答

步骤:

  1. 使用applymap将每个值转换为一个列表
  2. explode数据帧
  3. 如果有的话,去掉多余的空间
  4. 基于code3列删除df中的重复项,并保留最后一个值
  5. 删除code3列并加入code1 & code2
  6. 最后,使用groupby将它们聚合回来以获得所需的输出
df2 =(
    df11.assign(
        desired_output=df11.applymap(
            lambda x: x.split(';'))
        .apply(pd.Series.explode)
        .applymap(str.strip)
        .drop_duplicates(subset='code3', keep='last')
        .drop('code3', 1)
        .apply(' '.join, 1)
        .groupby(level=0)
        .agg('; '.join))
)

最新答复:

df2 = (
    df11.assign(
        desired_output=
        df11.apply(lambda s: s.str.split('; ').explode().str.strip())
        .drop_duplicates(subset='code3', keep='last')
        .drop('code3', 1)
        .apply(' '.join, 1)
        .groupby(level=0)
        .agg('; '.join)
        )
)

输出:

                          code1              code2  \
0  A123; A321; B478; B678; C567  A; B5; N5; R4; H5   
1  A321; A821; B448; B698; C577   A3; B; N; R7; H2   

                          code3             desired_output  
0  A445; A323; A323; A445; A659  B478 N5; B678 R4; C567 H5  
1  A328; A328; A621; A442; A621   A821 B; B698 R7; C577 H2  

我做了一些操作:

(1)使用正则表达式将项目提取到列表中,并反转列表顺序

(2)在“代码3”中查找唯一项的索引

(3)根据索引计算“代码1”和“代码2”中的相应值

import re

df = pd.DataFrame({"code1": ["A123; A321; B478; B678; C567", "A321; A821; B448; B698; C577"], "code2": ["A; B5; N5; R4; H5", "A3; B; N; R7; H2"],"code3": ["A445; A323; A323; A445; A659", "A328; A328; A621; A442; A621"]},      index=[0, 1], )
for col in df.columns:
    df[col] = df[col].apply(lambda x: re.findall(r'\w+', x)).apply(lambda x: x[::-1])

df['idx'] = df['code3'].apply(lambda x: [x.index(e) for e in set(x)])
df['code4'] = df.apply(lambda row: [row['code1'][i] + ' ' + row['code2'][i] for i in row['idx']], axis=1)

输出测向

    code1                           code2               code3                           idx         code4
0   [C567, B678, B478, A321, A123]  [H5, R4, N5, B5, A] [A659, A445, A323, A323, A445]  [0, 2, 1]   [C567 H5, B478 N5, B678 R4]
1   [C577, B698, B448, A821, A321]  [H2, R7, N, B, A3]  [A621, A442, A621, A328, A328]  [0, 3, 1]   [C577 H2, A821 B, B698 R7]

相关问题 更多 >

    热门问题