Python 基于关键点行查找跨轴的第一个复制
这是我的数据帧 [代码>df=pd.数据帧({0:代码>df=D层)的数据帧({0:{码>D层)的数据帧({0:{码>D层)的数据帧({0:1:1:1:7,1:7,1:7,1:1,1:1,1:7,2:2,5:2,5:7,5:7},1,1:6,2:6,2:4,3,3,3:5,5,4:5,4,5,4,4,4,4,4,4,4,4,4:5,4,4,4:5,4,4,4:4,4,4,4,4:4,4,4,4:3,4,4,3,3,3,3,5:3,3,3,3,5,5,5,5:3,5,5,5,5,5,5,5,5,},6:{'key':3,1:3,2:7,3:6,4:6,5:1},7:{'key':4,1:2,2:6,3:3,4:7,5:2},8:{'key':3,1:1,2:7,3:4,4:6,5:3},9:{'key':6,1:2,2:6,3:5,4:3,5:6}) 我需要找到相关索引与从左到右的键行相匹配的列 例如,在索引1中,第6列与键行具有相同的值,索引2与第9列的键行匹配,之前没有值。相同的逻辑可应用于索引3、4和5 我只需要索引与键值匹配的第一个实例,之后的所有值都无关紧要 预期产量Python 基于关键点行查找跨轴的第一个复制,python,pandas,Python,Pandas,这是我的数据帧 [代码>df=pd.数据帧({0:代码>df=D层)的数据帧({0:{码>D层)的数据帧({0:{码>D层)的数据帧({0:1:1:1:7,1:7,1:7,1:1,1:1,1:7,2:2,5:2,5:7,5:7},1,1:6,2:6,2:4,3,3,3:5,5,4:5,4,5,4,4,4,4,4,4,4,4,4:5,4,4,4:5,4,4,4:4,4,4,4,4:4,4,4,4:3,4,4,3,3,3,3,5:3,3,3,3,5,5,5,5:3,5,5,5,5,5,5,5,5,}
0 1 2 3 4 5 6 7 8 9 trace
key 2 3 4 3 6 2 3 4 3 6 NaN
1 7 6 3 4 5 4 3 2 1 2 6
2 5 4 3 2 3 6 7 6 7 6 9
3 4 5 4 3 6 7 6 3 4 5 2
4 2 3 4 5 4 3 6 7 6 3 0
5 7 6 3 4 3 2 1 2 3 6 5
我尝试了许多的变体,但似乎没有任何效果。您可以这样做:
import numpy as np
matching_column_indices = np.empty(len(df))
matching_column_indices[0] = np.nan
for row_index in range(1, len(df)):
row_matching_column_indices = df.loc[row_index] == df.loc["key"]
matching_column_indices[row_index] = row_matching_column_indices.idxmax()
df["trace"] = matching_column_indices
row\u matching\u column\u index.idxmax()
返回观察到的第一个True
值的列索引,对应于row\u index
处的行与键之间的列中的第一个匹配
结果df
:
0 1 2 3 4 5 6 7 8 9 trace
key 2 3 4 3 6 2 3 4 3 6 NaN
1 7 6 3 4 5 4 3 2 1 2 6.0
2 5 4 3 2 3 6 7 6 7 6 9.0
3 4 5 4 3 6 7 6 3 4 5 2.0
4 2 3 4 5 4 3 6 7 6 3 0.0
5 7 6 3 4 3 2 1 2 3 6 5.0
在检查df中的值与键行相等(eq
)的位置后,可以沿列使用with axis
df["trace"] = df.iloc[1:, :].eq(df.loc['key', :]).idxmax(axis=1)
print (df)
0 1 2 3 4 5 6 7 8 9 trace
key 2 3 4 3 6 2 3 4 3 6 NaN
1 7 6 3 4 5 4 3 2 1 2 6.0
2 5 4 3 2 3 6 7 6 7 6 9.0
3 4 5 4 3 6 7 6 3 4 5 2.0
4 2 3 4 5 4 3 6 7 6 3 0.0
5 7 6 3 4 3 2 1 2 3 6 5.0
问题不清楚搜索的是什么。可能你需要放一些图片来显示一些搜索(index1和index2)我不确定什么不清楚,但我得到了我想要的答案。谢谢你的尝试。你的解决方案确实有效,但我在处理熊猫时总是尽量避免for
循环
df["trace"] = df.iloc[1:, :].eq(df.loc['key', :]).idxmax(axis=1)
print (df)
0 1 2 3 4 5 6 7 8 9 trace
key 2 3 4 3 6 2 3 4 3 6 NaN
1 7 6 3 4 5 4 3 2 1 2 6.0
2 5 4 3 2 3 6 7 6 7 6 9.0
3 4 5 4 3 6 7 6 3 4 5 2.0
4 2 3 4 5 4 3 6 7 6 3 0.0
5 7 6 3 4 3 2 1 2 3 6 5.0