Применение функции к каждой ячейке данных - PullRequest
2 голосов
/ 14 мая 2019

Я немного запутался в том, как выполнять вычисления по фреймам данных. В основном у меня есть 10 данных, скажем, 10 строк и 10 столбцов. Я хотел бы в основном перебрать определенную ячейку в каждом кадре данных, добавить их в список и применить к нему функцию.

Пример: Получите все df (0,0) из 10 фреймов данных и добавьте их в список. В конце концов примените к ним функцию нормализации и заполните их нормализованные оценки обратно к соответствующим кадрам данных.

Ниже приведен вид вычисления, который я хочу выполнить после того, как я извлек все ячейки df (0,0) из 10 различных фреймов данных (например, rangex является списком)

import numpy as np

df1 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])

df2 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])

df3 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])

df4 = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)),
...                    columns=['a', 'b', 'c', 'd', 'e'])


rangex = [df1.iloc[0,0], df2.iloc[0,0], df3.iloc[0,0], df4.iloc[0,0]]

OldRange = (3.0 - (-3.0))  
NewRange = (100.0 - 0.0) 
listrangex=[]
for elem in rangex:
    val = (elem - np.mean(rangex))/np.std(rangex)
    val = (((val - (-3.0)) * NewRange) / OldRange) + 0.0
    listrangex.append( val )

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

IIUC: все сразу (сортировка)

Настройка

np.random.seed([3, 1415])

dict_of_dfs = {f'df{i}': pd.DataFrame(np.random.randn(25).reshape(5, 5)) for i in range(10)}

OldRange = np.array([-3, 3])
NewRange = np.array([0, 100])

Если у вас есть список данных, простой способ получить словарь -

dict_of_dfs = dict(enumerate(list_of_dfs))

Расчет моментов

df = pd.concat(dict_of_dfs)

mu = df.mean(level=1)
sg = df.std(level=1)

Определение нормализации

def nrm(d):
    _d = (d - mu) / sg
    o = OldRange[1] - OldRange[0]
    n = NewRange[1] - NewRange[0]
    return (_d - OldRange[0]) * o / n + NewRange[0]

Обновление фреймов данных с нормализованными данными

for k, d in dict_of_dfs.items():
    d.loc[:] = nrm(d)

Создание нового фрейма данных с помощью groupby

df.groupby(level=0).apply(lambda d: nrm(d.xs(d.name)))

Без функции нормализации и вычисления моментов

df.groupby(level=1).pipe(lambda g: df.sub(g.mean(), level=1).div(g.std(), level=1)) \
  .sub(OldRange[0]).mul(np.diff(OldRange)[0]).div(np.diff(NewRange)[0]).add(NewRange[0])

Подробности

mu

          0         1         2         3         4
0 -0.065247 -0.221818 -0.272167 -0.666434  0.353295
1  0.246533  0.049811 -0.279924 -0.025732  0.032529
2 -0.168676 -0.659385 -0.600390  0.211917 -0.007368
3  0.626222  0.072566 -0.702487 -0.338123 -0.009424
4 -0.286499  0.549944 -0.257438 -0.177977  0.254984

sg

          0         1         2         3         4
0  1.307826  1.226733  1.250311  0.931911  0.833170
1  0.758097  0.610464  0.988931  0.780028  0.696543
2  0.679647  0.962712  0.838219  0.530177  1.029039
3  0.774872  0.751137  0.570692  0.743676  0.966374
4  0.935141  0.988090  0.808165  0.937511  1.023745

# Before
dict_of_dfs['df0']

          0         1         2         3         4
0 -2.129724 -1.268466 -1.970500 -2.259055 -0.349286
1 -0.026955  0.316236  0.348782  0.715364  0.770763
2 -0.608208  0.352390 -0.352521 -0.415869 -0.911575
3 -0.142538  0.746839 -1.504157  0.611362  0.400219
4 -0.959443  1.494226 -0.346508 -1.471558  1.063243

# After
dict_of_dfs['df0']

          0         1         2         3         4
0  0.085287  0.128808  0.098500  0.077461  0.129404
1  0.158355  0.206186  0.218145  0.237005  0.243591
2  0.141198  0.243058  0.197743  0.108954  0.127279
3  0.120473  0.233860  0.095716  0.256605  0.205434
4  0.136823  0.237340  0.173387  0.097212  0.227371
0 голосов
/ 14 мая 2019

Возможно, я выключен, но это то, что вы пытаетесь сделать?

Используя цикл for, ячейка в строке i и столбце c извлекается из каждого dfкак x, манипулирует, чтобы дать вам val, затем добавляется к l:

i = row_value
c = column_name
rangex = []

for df in [df1, df2, ... df10]:
    val = df.loc[i,c]
    rangex.append(val)

for elem in rangex:
    val = (elem - np.mean(rangex))/np.std(rangex)
    val = (((val - (-3.0)) * NewRange) / OldRange) + 0.0
    listrangex.append( val )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...