Как применить функцию к датафрейму на месте

Можно ли использовать функцию scipy, например norm.cdf на месте на numpy.array (или pandas.DataFrame), используя вариант numpy.apply, numpy.apply_along_axs и т.д.


В фоновом режиме у меня есть таблица значений z-score, которые я бы хотел преобразовать в значения CDF для распределения нормы. В настоящее время я использую norm.cdf от scipy.

В настоящее время я манипулирую с фреймворком данных, который имеет нечисловые значения.

      Name      Val1      Val2      Val3      Val4 
0        A -1.540369 -0.077779  0.979606 -0.667112   
1        B -0.787154  0.048412  0.775444 -0.510904   
2        C -0.477234  0.414388  1.250544 -0.411658   
3        D -1.430851  0.258759  1.247752 -0.883293   
4        E -0.360181  0.485465  1.123589 -0.379157

(Сделать переменную Name индексом является решением, но в моем фактическом наборе данных имена не являются алфавитными символами.)

Чтобы изменить только числовые данные, я использую df._get_numeric_data() частную функцию, которая возвращает dataframe, содержащий числовые данные dataframe. Однако нет функции set. Следовательно, если я называю

norm.cdf(df._get_numeric_data)

это не изменит исходные данные df.

Я пытаюсь обойти это, применяя norm.cdf к числовому файлу данных inplace, поэтому это меняет исходный набор данных.

Ответ 1

Я думаю, я предпочел бы select_dtypes над _get_numeric_data:

In [11]: df.select_dtypes(include=[np.number])
Out[11]:
       Val1      Val2      Val3      Val4
0 -1.540369 -0.077779  0.979606 -0.667112
1 -0.787154  0.048412  0.775444 -0.510904
2 -0.477234  0.414388  1.250544 -0.411658
3 -1.430851  0.258759  1.247752 -0.883293
4 -0.360181  0.485465  1.123589 -0.379157

Хотя apply не предлагает inplace, вы можете сделать что-то вроде следующего (что я бы утверждал, было более явным в любом случае):

num_df = df.select_dtypes(include=[np.number])
df[num_df.columns] = norm.cdf(num_df.values)