Как представить табличные данные, используя Python (а может, pandas?) - PullRequest
0 голосов
/ 17 июня 2020

Я хочу создать таблицу (скажем, в записной книжке Jupyter) на основе функции и продукта двух списков. Чтобы привести конкретный пример, мои данные:

rows = [1, 2, 3, 4]
columns = [100, 200, 300]
f = x + y

Я ожидаю что-то вроде

    100 200 300
1   101 201 301
2   102 202 302
3   103 203 303
4   104 204 304

Мое текущее решение:

import pandas as pd
from itertools import product, zip_longest

# this is from the package more-itertools
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

f = lambda row: row[0] + row[1]
results = (
  pd.DataFrame(grouper(product(rows, columns), len(columns)), columns=columns, index=rows)
 .applymap(f)
)

Это очень запутанный, и я чувствую, что есть способ лучше

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

Вы ищете outer дополнение.

import pandas as pd
import numpy as np

pd.DataFrame(data=np.add.outer(rows, columns),
             index=rows,
             columns=columns)

   100  200  300
1  101  201  301
2  102  202  302
3  103  203  303
4  104  204  304
2 голосов
/ 17 июня 2020

Вы можете использовать преобразование rows и columns в массив NumPy и использовать здесь broadcasting.

rows = np.array([1, 2, 3, 4])
columns = np.array([100, 200, 300])

data = rows[:,None] + columns

df = pd.DataFrame(data,columns= columns,index=rows)
df
   100  200  300
1  101  201  301
2  102  202  302
3  103  203  303
4  104  204  304
...