создать кадр данных как функцию значения индекса строки и имени столбца?

76
5

Каков наилучший способ создания фрейма данных pandas как функции значения индекса строки и имени столбца?

Таким образом, для DataFrame, где индекс в X, столбцы в Y, каждое значение будет представлять собой f (x, y), где x в X и y в Y (например, может быть конкатенация имен индексов и столбцов)

Я знаю, что я могу написать цикл, чтобы сделать это, но лучше ли в пандах?

Благодарю!

спросил(а) 2021-01-25T16:53:46+03:00 4 месяца, 3 недели назад
1
Решение
77

Вы можете использовать понимание списка, чтобы подготовить значения в виде списка списков, а затем передать список списков в pd.DataFrame:

import pandas as pd
rows = ['1','2','3']
cols = ['X','Y']

df = pd.DataFrame(([col+row for col in cols] for row in rows),
index=rows, columns=cols)

доходность

    X   Y
1 X1 Y1
2 X2 Y2
3 X3 Y3

и, конечно, вы можете заменить col+row вызовом произвольной функции f:

df = pd.DataFrame(([f(row, col) for col in cols] for row in rows),
index=rows, columns=cols)

Если rows и/или cols большие, то список списков может потребовать много памяти. Вызов f для каждой ячейки может потребовать некоторого времени. В зависимости от f может быть более быстрый/менее интенсивный в памяти способ создания df. Например, чтобы np.char.add метки строк и столбцов, вы можете использовать np.char.add и np.meshgrid:

import numpy as np
rows = ['1','2','3']
cols = ['X','Y']

df = pd.DataFrame(np.char.add(*np.meshgrid(cols, rows, sparse=True, indexing='xy')),
index=rows, columns=cols)

дает тот же результат.

Это создает массив NumPy без создания временного списка списков, тем самым сохраняя память. Поскольку np.char.add создает результирующий массив NumPy в векторном виде, если rows и cols большие, результат получается быстрее, чем вычисление col+row (в Python) для каждой ячейки.

ответил(а) 2021-01-25T16:53:46+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема