Python 数据帧中的条件连接

Python 数据帧中的条件连接,python,pandas,dataframe,concatenation,Python,Pandas,Dataframe,Concatenation,我有三组代码,代码1,代码2和代码3,它们都有字母数字对象。所有代码都用分隔符分隔,这些代码是基于序列关联的,比如代码1的A123与代码2的A和代码3的A445相关,等等。代码3有一些代码重复或重复 我想要的输出是得到级联的代码4,其中代码1和代码2是基于这两个条件之一级联的 a如果代码3中的对应代码没有重复值 b如果代码3中的对应代码具有重复值,则需要使用与代码3中最后一个重复值的位置相对应的位置来连接代码1和代码2,如B678 R4,因为A445在代码3中重复了两次,并且需要考虑A445的第

我有三组代码,代码1,代码2和代码3,它们都有字母数字对象。所有代码都用分隔符分隔,这些代码是基于序列关联的,比如代码1的A123与代码2的A和代码3的A445相关,等等。代码3有一些代码重复或重复

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

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

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

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

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], )
期望的输出和输入代码应该如下所示

步骤: 使用applymap将每个值转换为列表。 分解数据帧。 如果有的话,去掉多余的空间。 根据code3列删除df中的重复项,并保留最后一个值。 删除code3列并加入code1和code2。 最后,使用groupby将它们聚合回来,以获得所需的输出。 最新答复:

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]

哇!我需要更多年的实践来实现这样的专家操作@Nk03回答得很好,尽管您可以大大减少应用/应用映射步骤的数量,例如,您可以使用df.applylambda s:s.str.split';'以矢量化方式拆分字符串。explode@ShubhamSharma我不知道我们可以使用explode inside apply。谢谢!!:@Nk03在解决类似问题时,我对drop duplicate命令有一些问题,我创建了一个新线程并将其链接到链接部分。
    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]