Python 计算一列中有多少个字符出现在另一列中(熊猫)

Python 计算一列中有多少个字符出现在另一列中(熊猫),python,pandas,Python,Pandas,我试图计算第一列中有多少个字符出现在第二列中。它们可能以不同的顺序出现,不应计数两次 例如,在这个df中 df = pd.DataFrame(data=[["AL0","CP1","NM3","PK9","RM2"],["AL0X24", "CXP44",

我试图计算第一列中有多少个字符出现在第二列中。它们可能以不同的顺序出现,不应计数两次

例如,在这个df中

df = pd.DataFrame(data=[["AL0","CP1","NM3","PK9","RM2"],["AL0X24",
                            "CXP44",
                            "MLN",
                            "KKRR9",
                            "22MMRRS"]]).T
结果应该是:

result = [3,2,2,2,3]
压缩两列后看起来像set.intersection:

[len(set(a).intersection(set(b))) for a,b in zip(df[0],df[1])]
#[3, 2, 2, 2, 3]

按照dataframe数据结构,您可以执行以下操作:

>>>def计数1,s2: ... 回位透镜组1和组2 ... >>>df[result]=df.applylambda x:count_commonx[0],x[1],轴=1 >>>df 0 1结果 0 AL0 AL0X24 3 1 CP1 CXP44 2 2 NM3百万分之二 3 PK9 KKRR9 2 4令吉2200万令吉3
如果比较具有相同多字符的名称(例如AAL0和AAL0X24),则其他解决方案将失败。这里的结果应该是4

from collections import Counter

df = pd.DataFrame(data=[["AL0","CP1","NM3","PK9","RM2", "AAL0"],
                        ["AL0X24", "CXP44", "MLN", "KKRR9", "22MMRRS", "AAL0X24"]]).T

def num_shared_chars(char_counter1, char_counter2):
    shared_chars = set(char_counter1.keys()).intersection(char_counter2.keys())
    return sum([min(char_counter1[k], char_counter2[k]) for k in shared_chars])

df_counter = df.applymap(Counter)
df['shared_chars'] = df_counter.apply(lambda row: num_shared_chars(row[0], row[1]), axis = 'columns')
结果:

      0        1  shared_chars
0   AL0   AL0X24             3
1   CP1    CXP44             2
2   NM3      MLN             2
3   PK9    KKRR9             2
4   RM2  22MMRRS             3
5  AAL0  AAL0X24             4

刚刚意识到set.intersection在性能方面比intersect1d更高效:@ShubhamSharma可能是,但我认为你应该保留你的答案。我已经测试过了,我猜intersection大约快10倍,不确定是什么原因…有什么线索吗?@ShubhamSharma可能是因为intersect1d返回一个排序数组-排序成本,返回两个输入数组中的排序后的唯一值,与内置值相比有一定的开销,不确定只是猜测而已。。!!是的..我认为排序步骤增加了运行时性能的额外开销…如果需要对输出进行排序,则intersect1d将是更好的选择,但这里我们只关心交叉点的长度。因此我认为intersect1d是不必要的。谢谢你的提示: