Как применить пользовательскую функцию к каждому столбцу кадра данных в пандах? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть фрейм данных, и я хотел бы создать новый фрейм данных, который создается путем применения пользовательской функции [которая принимает в качестве входных данных весь столбец] к каждому столбцу этого фрейма данных.Как я могу это сделать?

Редактировать: Позвольте мне сделать вопрос более ясным.Это мой фрейм данных и функция.

import pandas as pd
import numpy as np

cor_df = pd.DataFrame({'A':[0.345, 0.985, 0.912, 0.645, 0.885, 0.121],
                       'B':[0.475, 0.502, 0.312, 0.231, 0.450, 0.234],
                       'C':[0.098, 0.534, 0.125, 0.984, 0.236, 0.734],
                       'D':[0.345, 0.467, 0.935, 0.074, 0.623, 0.469]})

def rtoz(r):
    z = 0.5 * np.log((1. + r) / (1. - r));
    return z

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я нашел решение, которое искал с помощью этого поста

import pandas as pd
import numpy as np

cor_df = pd.DataFrame({'A':[0.345, 0.985, 0.912, 0.645, 0.885, 0.121],
                       'B':[0.475, 0.502, 0.312, 0.231, 0.450, 0.234],
                       'C':[0.098, 0.534, 0.125, 0.984, 0.236, 0.734],
                       'D':[0.345, 0.467, 0.935, 0.074, 0.623, 0.469]})

def rtoz(r):
    z = 0.5 * np.log((1. + r) / (1. - r));
    return z

rtoz_df = pd.DataFrame() # new data frame to store r to z transformed values
cols = cor_df.columns
rtoz_df[cols] = cor_df[cols].apply(rtoz)
0 голосов
/ 05 октября 2018

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

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

%timeit rtoz(df)                                           # 1.21 ms per loop
%timeit pd.DataFrame(rtoz(df.values), columns=df.columns)  # 180 µs per loop
%timeit rtoz(df.values)                                    # 33.7 µs per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...