——大家好!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 == 55
或df == 55
创建一个布尔数据框,但似乎不能用它做任何事情。
另一个"farthest"我得到的方式是使用df.unstack.idxmax()
,这将返回列和标题的元组,但有2个主要问题:
- 只返回
.idxmax()
,.idxmin()
函数的max/min - 只返回第一列/索引匹配我的值,这没有帮助,如果有重复
我知道我可以做一个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)