Python 数据帧中的条件连接
我有三组代码,代码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脚本是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的第
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]