Итерация по всему фрейму данных Pandas с использованием столбца и строки в качестве аргументов

У меня есть этот пустой фрейм данных pandas и значение функции (x, y), которое принимает 2 аргумента, номер строки и номер столбца точки в фрейме данных pandas. Мне было интересно, есть ли более простой способ перебрать весь пустой фрейм данных с использованием этих аргументов, возможно, используя df.apply.

Я знаю, что можно пройти через каждый отдельный столбец и запустить df.apply для отдельных столбцов, но возможно ли это сделать без запуска каких-либо циклов или чего-то еще.

По сути, я ищу что-то подобное, которое я могу запустить на всем фрейме данных

df_copy.apply(lambda x: myfunction(x.value, x.column))

Однако x.column не существует, поэтому есть другой способ сделать это, или я делаю что-то не так

Спасибо!


person Anonymous Dodo    schedule 27.02.2019    source источник
comment
Что ты пробовал? Просмотрите Как задать вопрос, а также создайте минимальный воспроизводимый пример   -  person user3483203    schedule 28.02.2019
comment
@ user3483203 дает ли это немного больше разъяснений?   -  person Anonymous Dodo    schedule 28.02.2019


Ответы (1)


Да, используйте атрибуты name и index серии:

df = pd.DataFrame(1, index = np.arange(10,51,10), columns = np.arange(5))

Показать фрейм данных ввода

    0  1  2  3  4
10  1  1  1  1  1
20  1  1  1  1  1
30  1  1  1  1  1
40  1  1  1  1  1
50  1  1  1  1  1

Давайте определим настраиваемую функцию и будем использовать строки в качестве столбцов для вычисления.

def f(x):
    #add row values to column values
    return x.name + x.index

df.apply(f)

Выход:

     0   1   2   3   4
10  10  11  12  13  14
20  20  21  22  23  24
30  30  31  32  33  34
40  40  41  42  43  44
50  50  51  52  53  54

Примечание: apply передает каждый столбец фрейма данных (который является pd.Series) в функцию f. Каждая серия имеет атрибут name, который является заголовком столбца, и index, который является индексом строки фрейма данных. Итак, функция f возвращает вычисленный pd.Series для каждого столбца фрейма данных и снова объединяется как фрейм данных.

Отвечая на вопрос в комментариях, воспользуемся строками:

df = pd.DataFrame(1, index=['Ted','Bill','Ralph','John','Tim'], columns=['A','B','C','D','E'])

def f(x):
    #Concatenate row values with column values
    return x.index + '_' + x.name

df.apply(f)

ИЛИ используйте лямбда-функцию

df.apply(lambda x: x.index + '_' + x.name)

Выход:

             A        B        C        D        E
Ted      Ted_A    Ted_B    Ted_C    Ted_D    Ted_E
Bill    Bill_A   Bill_B   Bill_C   Bill_D   Bill_E
Ralph  Ralph_A  Ralph_B  Ralph_C  Ralph_D  Ralph_E
John    John_A   John_B   John_C   John_D   John_E
Tim      Tim_A    Tim_B    Tim_C    Tim_D    Tim_E
person Scott Boston    schedule 27.02.2019
comment
Таким образом, это работает, однако x.name и x.index являются объектами RangeIndex - есть ли способ преобразовать эти значения в целые числа - person Anonymous Dodo; 28.02.2019
comment
Да, я приложил пример в решении. - person Scott Boston; 28.02.2019