我有这样的数据框架:
Names Subsets Subnames SubNumber Numbers
AE,AI,AK OP,OP,DO ABC,ABC,ABC A-890,A891 9OP-A,98-OPB,8IC,87AC,58AP,7PL
AO,AI DO,AP KLM,ABC P890 L97, 52PL
IK,LJ,MI OP,OP,DO IJK,IJK,OPQ 90AKI 87AU, 90OP,89JN
从这样的数据框架中,
对于具有OP,OP,DO
的子集,我需要编号以I
结尾的名称。
例如。因为第一行有子集OP,OP,DO
,第一个索引的名称末尾有字母I
。因此,具有每个第一个索引98-OPB,58AP
的数字是我需要的输出。(每个第一个索引意味着Name中有三个元素。所以在第二个数字索引之后,还是从第0个索引开始)
Names Subsets Subnames SubNumber Numbers Output
AE,AI,AK OP,OP,DO ABC,ABC,ABC A-890,A891 9OP-A,98-OPB,8IC,87AC,58AP,7PL 98-OPB,58AP
AO,AI DO,AP KLM,ABC P890 L97, 52PL
IK,LJ,MI OP,OP,DO IJK,IJK,OPQ 90AKI 87AU, 90OP,89JN 89JN
在第三行中,MI
是第二个索引,因此这里需要第二个索引号89JN
。
从0开始索引。
这实际上是一个for
循环,因为您处理的是object dtype
。你也许能够做出一些小的改进,但我真的不知道如何在我的脑海中获得任何大的收益——这是一些相当混乱的"提取"。逻辑:
def extract(row):
names = row.Names.split(",")
numbers = row.Numbers.split(",")
idxs = {i for i, name in enumerate(names) if name[-1] == "I"}
return ",".join(num for i, num in enumerate(numbers) if i % len(names) in idxs)
输出:
>>> df["Output"] = df[df["Subsets"] == "OP,OP,DO"].apply(extract, axis=1)
>>> df
Names Subsets Subnames SubNumber Numbers Output
0 AE,AI,AK OP,OP,DO ABC,ABC,ABC A-890,A891 9OP-A,98-OPB,8IC,87AC,58AP,7PL 98-OPB,58AP
1 AO,AI DO,AP KLM,ABC P890 L97,52PL NaN
2 IK,LJ,MI OP,OP,DO IJK,IJK,OPQ 90AKI 87AU,90OP,89JN 89JN
如果你不想要NaN
:
df["Output"] = df["Output"].fillna("")