我想获取Pandas数据框中每个单元格的索引和列名。

例如,在下面的代码生成的数据框中

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()根据其在数据框中的位置来更新数据框中的每个值。需要索引和列名(n x n数据帧中的等效标识符和有序标识符)才能从另一个数据帧提取值。

谢谢!

最佳答案

我建议使用自己的函数来执行此操作。您可以使用类似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


该文档提供有关indexing pandas dataframes的详细信息。

由于我误解了评论中阐明的问题,因此进行了更新:

def look_for_value(df, value):
    l = []
    for row in df.itertuples():
        print(row)
        if value in row[1:]:
            # appending a tuple of the format `(index name, column name)`
            l.append((row[0], df.columns[row.index(value)-1]))
    return l


def look_using_generator(df, value):
    return [(row[0], df.columns[row.index(value)-1]) for row in df.itertuples() if value in row[1:]]


我使用比.itertuples()更快的.iterrows()遍历数据帧的所有行,并寻找所需的条目/值。如果在行中找到该值,则将包含索引和列名的元组存储到列表中,该列表最后返回。我在第一个函数中提供了一种逐步解决方案,并在列表理解中使用生成器提供了一个单行代码。

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

假设我们要查找所有值6并将其替换为66

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

关于python - 获取数据帧的所有单元格作为(索引,列)的元组,以传递给df.apply(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35108108/

10-12 14:04
查看更多