Python 如何将多个列与给定的单个列匹配,并在新列中获取其名称?

Python 如何将多个列与给定的单个列匹配,并在新列中获取其名称?,python,pandas,Python,Pandas,我想在多个列中匹配某些条件。如果条件匹配,则返回列名: 我的演示文稿是: df = pd.DataFrame({"mtc": ["A", "B", "C", "D"], "C1": ["A", "A", "A", "C"],

我想在多个列中匹配某些条件。如果条件匹配,则返回列名:

我的演示文稿是:

df = pd.DataFrame({"mtc": ["A", "B", "C", "D"],
                     "C1": ["A", "A", "A", "C"],
                    "C2": ["X", "B", "A", "C"],
                    "C3": ["Y", "D", "A", "D"],
                    "C4": ["Z", "D", "C", "C"]})


    mtc C1  C2  C3  C4
0   A   A   X   Y   Z
1   B   A   B   D   D
2   C   A   A   A   C
3   D   C   C   D   C
在这里,我想将
mtc列中的值与列['C1'、'C2'、'C3'、'C4']
中的值进行匹配

我在
结果列中的预期输出为:

   mtc  Result  C1  C2  C3  C4
0   A     C1    A   X   Y   Z
1   B     C2    A   B   D   D
2   C     C4    A   A   A   C
3   D     C3    C   C   D   C
这将产生输出-

mtc C1 C2 C3 补体第四成份 结果 A. A. X Y Z C1 B A. B D D C2 C A. A. A. C 补体第四成份 D C C D C C3 解决方案 解释 过滤
C
类列,然后沿
axis=0
将这些列与
mtc
列进行比较,以创建布尔掩码

>>> m
      C1     C2     C3     C4
0   True  False  False  False
1  False   True  False  False
2  False  False  False   True
3  False  False   True  False
现在我们可以使用
idxmax
沿
axis=1
获取包含上述布尔掩码中第一个
True
值的列的名称。此外,我们还可以屏蔽列名,以防找不到匹配项

>>> m.idxmax(1)

0    C1
1    C2
2    C4
3    C3
dtype: object

>>> df

  mtc C1 C2 C3 C4 Result
0   A  A  X  Y  Z     C1
1   B  A  B  D  D     C2
2   C  A  A  A  C     C4
3   D  C  C  D  C     C3
您可以在
mtc
上找到
mtc==value
的第一个匹配项:

m=df.melt('mtc')
m=m[m.mtc==m.value]。删除重复项(subset='mtc',keep='first')
#mtc变量值
#0 A C1 A
#5 B C2 B
#11 D C3 D
#14 C C4 C
然后返回到
df

df['Result']=df.mtc.map(m.set_index('mtc')。变量)
#mtc C1 C2 C3 C4结果
#0aaxyzc1
#1 B A B D C 2
#2立方碳四
#三维C 3

您的答案有效,但速度滞后
5.08 ms±186µs/圈(7次运行的平均值±标准偏差,每次100圈)
@SurajS您测试答案的数据大小是多少?尝试增加数据量并再次测试,我相信通过使用矢量化方法,您会看到性能的提高。此外,如果在
mtc
C
类似列之间始终存在匹配,则可以跳过
掩码
部分。如何替换
.eq(df['mtc',轴=0)
对于像
=&@SurajS这样的东西,我不确定你所说的不完全匹配是什么意思,但我想你可以试试
.le
对于
=
是的,这就是我想要的,但是如果两者都需要,比如
=&你的答案与其他
相比,每个循环的速度也有2.96 ms±205µs(平均±标准偏差为7次,每个循环100次)
如果给出重复数据,您的答案将失败,例如如果
c1和c2在第1行
中具有相同的值,则重复问题现在应该得到解决,但此解决方案可能比其他解决方案慢。
>>> m
      C1     C2     C3     C4
0   True  False  False  False
1  False   True  False  False
2  False  False  False   True
3  False  False   True  False
>>> m.idxmax(1)

0    C1
1    C2
2    C4
3    C3
dtype: object

>>> df

  mtc C1 C2 C3 C4 Result
0   A  A  X  Y  Z     C1
1   B  A  B  D  D     C2
2   C  A  A  A  C     C4
3   D  C  C  D  C     C3