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