更新
好的,现在我更好地理解了您的问题,这对您有用。
首先使用
更改数据框的形状
dfs = df.stack().swaplevel(axis=0)
这将使您的数据框看起来像:
然后您可以像以前一样迭代行并提取您想要的信息。我只是对所有内容都使用 print 语句,但您可以将其放入一些更合适的数据结构中。
for index, row in dfs.iterrows():
dup_filter = row.duplicated(keep=False)
dfss = row_tuple[dup_filter].index.values
print("Attribute:", index[0])
print("Index:", index[1])
print("Matches:", dfss, "\n")
会打印出类似的东西
.....
Attribute: compass
Index: 5
Matches: ['df1' 'df3']
Attribute: gyro
Index: 5
Matches: ['df1' 'df3']
Attribute: accel
Index: 6
Matches: ['df1' 'df3']
....
你也可以一次只做一个属性
dfs_compass = df.stack().swaplevel(axis=0).loc['compass']
并仅使用索引遍历行。
旧
如果我正确理解您的问题,即您想要返回在列的第二级具有匹配值的行的索引,即('compass'、'accel'、'gyro')。以下将起作用。
compass_match_indexes = []
for index, row in df.iterrows():
match_filter = row[:, 'compass'].duplicated()
if len(row[:, 'compass'][match_filter] > 0)
compass_match_indexes.append(index)
您可以使用 df.loc[compass_match_indexes] 等列表选择您的数据框
--
另一种方法,您可以使用 df.T 对 DataFrame 进行转换,然后使用 duplicated 函数。