如何从数据框架中提取特定值的索引和列?



——大家好!Python熊猫的新学生来了。

我在这里人工构建了一个数据框架:https://i.stack.imgur.com/cWgiB.png。下面是一个文本重建。

df_dict = {
'header0' : [55,12,13,14,15],
'header1' : [21,22,23,24,25],
'header2' : [31,32,55,34,35],
'header3' : [41,42,43,44,45],
'header4' : [51,52,53,54,33]
}
index_list = {
0:'index0',
1:'index1',
2:'index2',
3:'index3',
4:'index4'
}
df = pd.DataFrame(df_dict).rename(index = index_list)

目标:

我想拉任何任意值(int, float, str等)的索引行和列头。例如,如果我想要55的值,这段代码将以某种格式返回:header0,index0,header2,index2。它们可以是list、tuple或print等。

澄清:

  • 假设数据帧足够大,我无法"手动找到它">
  • 我不知道这个值与其他值相比有多大(所以一个简单的.idxmax()"可能不会削减它)
  • 我不知道这个值是列还是索引(所以"只是.loc,.iloc的值是"也没用)
  • 我不知道这个值是否有重复的,但如果有,返回所有的列/索引。

WHAT I'VE been FAR:

我已经玩了.columns,.index,.loc,但似乎无法得到答案。我得到的最远的是用df.values == 55df == 55创建一个布尔数据框,但似乎不能用它做任何事情。

另一个"farthest"我得到的方式是使用df.unstack.idxmax(),这将返回列和标题的元组,但有2个主要问题:

  1. 只返回.idxmax(),.idxmin()函数的max/min
  2. 只返回第一列/索引匹配我的值,这没有帮助,如果有重复

我知道我可以做一个for loop来迭代整个数据框架,跟踪我在临时变量中的列和索引。一旦我达到我正在寻找的值,我将break并返回当前列和索引。我只是希望有一个不那么暴力的方法,因为我想要一个"高速计算"。方法,可以在任何大小的数据帧上工作。

谢谢。

编辑:添加文本数据库,澄清问题。

使用np.where:

r, c = np.where(df == 55)    
list(zip(df.index[r], df.columns[c]))

输出:

[('index0', 'header0'), ('index2', 'header2')]

在pandas中有一个函数提供重复的行。

duplicate = df[df.duplicated()]
print(duplicate)

Series with MultiIndex使用DataFrame.unstack,然后用keep=False过滤Series.duplicated:

s = df.unstack()
out = s[s.duplicated(keep=False)].index.tolist()

如果需要也与values重复:

df1 = (s[s.duplicated(keep=False)]
.sort_values()
.rename_axis(index='idx', columns='cols')
.reset_index(name='val'))

如果需要更改Series.eq(==)的掩码:

s = df.unstack()
out = s[s.eq(55)].index.tolist()

所以,在下面的代码中,有一个迭代。但是,它不会遍历整个DataFrame,而只是遍历列,然后使用.any()检查是否存在任何所需的值。然后使用熊猫中的loc特性定位值,最后返回index

wanted_value = 55
for col in list(df.columns):
if df[col].eq(wanted_value).any() == True:
print("row:", *list(df.loc[df[col].eq(wanted_value)].index), ' col', col)