Python 获取dataframe的所有单元格作为(索引,列)的元组,以传递给df.apply()

Python 获取dataframe的所有单元格作为(索引,列)的元组,以传递给df.apply(),python,pandas,dataframe,indexing,Python,Pandas,Dataframe,Indexing,我想得到熊猫数据框中每个单元格的索引和列名 例如,在以下代码生成的数据帧中 df = pd.DataFrame({1 : np.arange(1, 6), 2 : np.arange(6, 11), 3 : np.arange(11, 16), 4 : np.arange(16, 21), 5 : np.arange(21, 26)}, inde

我想得到熊猫数据框中每个单元格的索引和列名

例如,在以下代码生成的数据帧中

df = pd.DataFrame({1 : np.arange(1, 6), 
               2 : np.arange(6, 11),
               3 : np.arange(11, 16),
               4 : np.arange(16, 21),
               5 : np.arange(21, 26)}, 
              index=[1, 2, 3, 4, 5])
我想访问值的行索引和值的列名的索引/列名组合,例如[1,1]表示1、[2,1]表示2、[3,1]表示3等

最终目标是使用df.apply()根据数据帧中的每个值的位置更新数据帧中的每个值。从另一个数据帧中提取值需要索引名和列名(nxn数据帧中的等效标识符和有序标识符)


谢谢

我建议使用自己的函数来实现这一点。您可以使用类似dict的表示法访问数据帧的每一列。除了通过访问所需的索引/行来获得所需的元素外,我还将使用
.ix
,如下所示

import pandas as pd

df = pd.DataFrame({1 : np.arange(1, 6), 
               2 : np.arange(6, 11),
               3 : np.arange(11, 16),
               4 : np.arange(16, 21),
               5 : np.arange(21, 26)}, 
              index=[1, 2, 3, 4, 5])

def get_from_coords(df, x, y):
    return df[x].ix[y]
例如:

In [2]: get_from_coords(df, 2, 1)
Out[2]: 6
这些文件提供了有关的详细信息

更新,因为我误解了评论中澄清的问题:

我正在遍历数据帧的所有行,使用的速度比使用的速度快,并查找所需的条目/值。如果在行中找到该值,则将包含索引和列名的元组存储到列表中,该列表在末尾返回。我在第一个函数中提供了一种逐步解决方案,并在列表理解中使用了一个生成器提供了一个单行程序

编辑,因为OP指出他需要列和索引名来更改相应的值:

假设我们希望找到所有值
6
,并将它们替换为
66

for item in look_using_generator(df, 6):
    df[item[0]].ix[item[1]] = 66

使用
df.columns[列位置]
获取列标签。相反:使用
df.columns.get_loc(“列标签”)
获取列位置

类似地,对于行,
df.index[row position]
获取行索引。相反:使用
df.index.get_loc('index label')
获取行位置

至于您的问题,直接按行和列位置循环数据帧,然后按.iloc访问

例如:


我正试图做相反的事!对于值6,我想得到(2,1)。我想避免嵌套for循环。对不起,我理解错了。没问题,我对问题做了一些澄清。重复条目怎么办?您想只获取第一个或最后一个匹配项,还是更确切地说,一个包含所有匹配项坐标的列表?我希望每个值都有一对索引和列名。还有重复的条目。我正在填充一个pearson相似系数矩阵,其中索引和列是用户ID。如果需要“从另一个数据帧中提取值”,完全不需要这样做,所以不要这样做(“最终目标是使用df.apply()根据数据帧中的位置更新数据帧中的每个值”),然后使用
df.join()
命令,这就是它的用途。学习dataframe的习惯用法,不要只是试图强行将代码转换成表面上类似的东西(无论如何,这不会是可伸缩的或性能)。dataframes的全部要点是,我们几乎从来没有传递过大量的coords列表,当然不是整个df,更不用说一大块了。
for item in look_using_generator(df, 6):
    df[item[0]].ix[item[1]] = 66
def lookup(df, value):
    l = []
    for i in range(df.shape[0]):
        for j in range(df.shape[1]):
            if df.iloc[i, j] == value:
                l.append((df.index[i], df.columns[j]))
    return l